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的装饰器的运用
May 05 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
浅析Python基础-流程控制
Mar 18 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python装饰器知识点补充
May 28 Python
python定时关机小脚本
Jun 20 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
Python列表与元组的异同详解
Jul 02 Python
Flask框架模板继承实现方法分析
Jul 31 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
Python读取二进制文件代码方法解析
Jun 22 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
numpy 计算两个数组重复程度的方法
2018/11/07 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
python文字转语音的实例代码分析
2019/11/12 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
毕业生文员求职信
2013/11/03 职场文书
入团者的自我评价分享
2013/12/02 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
英语教师个人工作总结
2015/02/09 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
关于分班的感言
2015/08/04 职场文书
Python实现批量自动整理文件
2022/03/16 Python