Django权限设置及验证方式


Posted in Python onMay 13, 2020

当创建一个Models, 在同步到数据库里,django默认设置了三个权限 ,就是 add, change, delete权限。但是往往有时候,根本不够用,此时我们可以自己写一个脚本,来进行权限的设置.

根据DJango官方文档解释,权限都是与models有关系的,此时.如果想设置一个view,对于有权限的用户进行放行,对于无权限的用户进行限制.那么我们就可以着手来写这个需求.

验证权限的方法一般有两种,一种是用@permission_required来进行验证,第二中是用user.has_perm()在函数里进行验证,通过返回的True或者False来进行下一步

同时我的稍微复杂一些,是在django中加入了第三方认证oauth2,并限制跨域访问的资源.具体见我之前的文章.

具体步骤如下:

第一步:

设置跨域访问资源范围,如下:

CORS_URLS_REGEX = r'^/(o|api/oauth/).*$'
#只允许跨域访问url为/o/....或者/api/oauth/...的资源

第二步:

写一个设置permission脚本,或者你自己创建一个model,然后migrate得到django默认提供的三个权限,当然,这过于繁琐和单一,你也可以自定义permission,在你创建的model里添加Meta类,然后创建你的自定义permission.如下:

class **Model():
        ....
        class Meta:
        permissions = (
          (can_read'', '查看'),
          (can_delete'', '删除'),
        )

或者, 你可以自己写一个创建permission的文件.这里,我的需求是根据用户来限制是否访问资源,直接在User上来进行permission设置,如下:

from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
 
def run(codename, name):
  content_type = ContentType.objects.get_for_model(User)
  permission = Permission.objects.get_or_create(codename=codename, name=name, content_type=content_type)
  return permission

运行run即可创建指定codename的permission,这与用户是绑定的.

第三步:

验证权限,最主要的有两种方法,用装饰器方法,或者在函数里用has_perm/has_perms,我这里使用装饰器方法,当然.最开始我自己手写了一个验证装饰器,后来发现,django有自带的,也比较好用,直接在views函数钱@permission_required(perms)即可.

由于此处我用的是django的视通函数,无法直接在函数前加@permission_required(perms),需要用到如下方法,可以将函数装饰器改为方法或类装饰器的方法,django自带的@method_decorator(decorator),

用法如下

class LimitView(ProtectedResourceView):
  @method_decorator(permission_required(per_list[0]))
  def get(self, request):
    ....

LimitView为我自己的视图函数,继承自oauth的ProtectedResourceView,作用是保护视图函数不被授权用户查看.permission_required参数为用户需要拥有的权限,如果有,可以正常访问,否则,会重定向到登录页面,或者你可以在此处自己指定转向页面.

需要注意的是使用@permission_required(perms)时request.user需有字段,否则会报错.我这里没有登录也可以访问授权是因为我使用了用户允许的授权码访问,会直接在request中设置user字段为该access_token对应的user.

补充知识:django 校验用户是否有权限

views中判断是否有权限:

{% if request.user.has_perm('app.权限名')%}
……
 {%endif%}

html中根据权限判断控件是否显示:

{% if perms.appname.codename%}
{% endif%}

切记:要想html中变量生效,必须传入RequestContext,views.py中必须是render(request,'xx.html',{}),这个问题纠结很久。

参考django文档:https://docs.djangoproject.com/en/2.1/topics/auth/default/#permissions

以上这篇Django权限设置及验证方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用剪切板的方法
Jun 06 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python实现的购物车功能示例
Feb 11 Python
python使用sqlite3时游标使用方法
Mar 13 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
python中web框架的自定义创建
Sep 08 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
Python标准库itertools的使用方法
Jan 17 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 #Python
django自带的权限管理Permission用法说明
May 13 #Python
Python基于jieba, wordcloud库生成中文词云
May 13 #Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 #Python
Jupyter notebook如何实现指定浏览器打开
May 13 #Python
基于FME使用Python过程图解
May 13 #Python
django rest framework serializers序列化实例
May 13 #Python
You might like
用php和MySql来与ODBC数据连接
2006/10/09 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
xss文件页面内容读取(解决)
2010/11/28 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
实例Python处理XML文件的方法
2015/08/31 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
django有哪些好处和优点
2020/09/01 Python
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
自荐信封面
2013/12/04 职场文书
商场端午节活动方案
2014/01/29 职场文书
租房协议书
2014/04/10 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
Python一些基本的图像操作和处理总结
2021/06/23 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript
python 镜像环境搭建总结
2022/09/23 Python