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自动登录126邮箱的方法
Jul 10 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
Django中的forms组件实例详解
Nov 08 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
python 解决cv2绘制中文乱码问题
Dec 23 Python
Python表达式的优先级详解
Feb 18 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
python 爬取华为应用市场评论
May 29 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
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
jQuery拖拽 & 弹出层 介绍与示例
2013/12/27 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
node.js require() 源码解读
2015/12/13 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
jquery+css实现下拉列表功能
2017/09/03 jQuery
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
python select.select模块通信全过程解析
2017/09/20 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
高级Java程序员面试要点
2013/08/02 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
绩效工资分配方案
2014/01/18 职场文书
公立医院改革实施方案
2014/03/14 职场文书
大学生赌博检讨书
2014/09/22 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
安全学习心得体会范文
2016/01/18 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python