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 GAE、Django导出Excel的方法
Nov 24 Python
初步剖析C语言编程中的结构体
Jan 16 Python
详解python的ORM中Pony用法
Feb 09 Python
python数字图像处理之高级形态学处理
Apr 27 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
大数据分析用java还是Python
Jul 06 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
Python 求向量的余弦值操作
Mar 04 Python
python通过opencv调用摄像头操作实例分析
Jun 07 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 文件上传功能实现代码
2009/06/24 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
小小聊天室Python代码实现
2016/08/17 Python
Python中super函数的用法
2017/11/17 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
单位创先争优活动方案
2014/01/26 职场文书
学习型班组申报材料
2014/05/31 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python