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从sqlite读取并显示数据的方法
May 08 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
Python动态生成多维数组的方法示例
Aug 09 Python
python实现Zabbix-API监控
Sep 17 Python
使用Python进行目录的对比方法
Nov 01 Python
关于python多重赋值的小问题
Apr 17 Python
python ChainMap的使用和说明详解
Jun 11 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
python实现简单石头剪刀布游戏
Oct 24 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php实现socket推送技术的示例
2017/12/20 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
js处理自己不能定义二维数组的方法详解
2014/03/03 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
Python中设置变量访问权限的方法
2015/04/27 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
SQL语言面试题
2013/08/27 面试题
酒店实习个人鉴定
2013/12/07 职场文书
美德少年事迹材料
2014/01/23 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
检讨书范文300字
2015/01/28 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
工程款申请报告
2015/05/15 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
MySQL里面的子查询的基本使用
2021/08/02 MySQL