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通过ftplib登录到ftp服务器的方法
May 08 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
Python实现App自动签到领取积分功能
Sep 29 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
Python双链表原理与实现方法详解
Feb 22 Python
python为什么会环境变量设置不成功
Jun 23 Python
python两个list[]相加的实现方法
Sep 23 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
Python如何使用logging为Flask增加logid
Mar 30 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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 array 的加法操作代码
2010/07/24 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
js中eval详解
2012/03/30 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
Jquery实现遮罩层的方法
2015/06/08 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
Python操作json的方法实例分析
2018/12/06 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
优秀士兵个人事迹材料
2014/01/19 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
初中信息技术教学计划
2015/01/22 职场文书
努力学习保证书
2015/02/26 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
通讯稿格式及范文
2015/07/22 职场文书
配置Kubernetes外网访问集群
2022/03/31 Servers
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL