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网络编程 Python套接字编程
Sep 13 Python
python编程使用协程并发的优缺点
Sep 20 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
python能做什么 python的含义
Oct 12 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
python获取array中指定元素的示例
Nov 26 Python
如何使用repr调试python程序
Feb 28 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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中strtotime函数使用方法详解
2011/11/27 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
详解K-means算法在Python中的实现
2017/12/05 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
Android笔试题总结
2014/11/29 面试题
毕业生自我鉴定范文
2013/11/08 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
证婚人致辞精选
2015/07/28 职场文书
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis
Android 中的类文件和类加载器详情
2022/06/05 Java/Android