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之网站的结构
Oct 24 Python
Python实现简单多线程任务队列
Feb 27 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
Python中文件的读取和写入操作
Apr 27 Python
实例讲解python中的序列化知识点
Oct 08 Python
Python2与Python3的区别实例总结
Apr 17 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
python中id函数运行方式
Jul 03 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python编程super应用场景及示例解析
Oct 05 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代码
2006/12/06 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP序列化操作方法分析
2016/09/28 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
Python中正则表达式的详细教程
2015/04/30 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
python list格式数据excel导出方法
2018/10/31 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
委托书样本
2014/04/02 职场文书
环境整治工作方案
2014/05/18 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
教师党员承诺书2015
2015/01/21 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python