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 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
使用PYTHON创建XML文档
Mar 01 Python
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python中对列表排序实例
Jan 04 Python
Python基础中所出现的异常报错总结
Nov 19 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python游戏开发的五个案例分享
Mar 09 Python
Python接口测试数据库封装实现原理
May 09 Python
如何在Windows中安装多个python解释器
Jun 16 Python
如何理解python对象
Jun 21 Python
Python3读写ini配置文件的示例
Nov 06 Python
能让Python提速超40倍的神器Cython详解
Jun 24 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 is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
php字符串操作常见问题小结
2016/10/11 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python如何获取系统iops示例代码
2016/09/06 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
python分布式计算dispy的使用详解
2019/12/22 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
Python tornado上传文件的功能
2020/03/26 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
设置器与访问器的定义以及各自特点
2016/01/08 面试题
培训讲师邀请函
2014/01/10 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
python解决12306登录验证码的实现
2021/04/18 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
Js类的构建与继承案例详解
2021/09/15 Javascript
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers