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 字符串格式化代码
Mar 17 Python
Python中os.path用法分析
Jan 15 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
python用plt画图时,cmp设置方法
Dec 13 Python
python使用正则筛选信用卡
Jan 27 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 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中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
php压缩文件夹最新版
2018/07/18 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
2018/09/04 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
python 正确保留多位小数的实例
2018/07/16 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
python中random模块详解
2021/03/01 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
单位推荐信范文
2015/03/27 职场文书