Django权限设置及验证方式

作者:guyunzh 时间:2022-12-28 23:45:18 

当创建一个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

来源:https://blog.csdn.net/guyunzh/article/details/80320366

标签:Django,权限,验证
0
投稿

猜你喜欢

  • 解析:以mysql_开始的未定义引用错误

    2008-12-19 17:58:00
  • python中remove函数的踩坑记录

    2022-10-25 18:32:50
  • 详解MySQL中的SQRT函数的使用方法

    2024-01-28 03:59:32
  • Python元组的定义及使用

    2021-06-30 01:24:40
  • Python实现简单的文件传输与MySQL备份的脚本分享

    2024-01-21 04:44:44
  • 修改mysql密码与忘记mysql密码的处理方法

    2024-01-23 21:53:48
  • Golang拾遗之实现一个不可复制类型详解

    2024-05-13 10:40:29
  • python PyGame五子棋小游戏

    2023-09-29 13:32:45
  • Vue生产和开发环境如何切换及过滤器的使用

    2024-05-09 15:20:31
  • Node.js API详解之 Error模块用法实例分析

    2024-05-13 09:58:47
  • ASP名次排列函数

    2008-07-20 13:42:00
  • 浏览器中的内存泄露(续)解决方案

    2008-05-03 17:14:00
  • Java基于MySQL实现学生管理系统

    2024-01-23 07:32:02
  • SESSION存放在数据库用法实例

    2024-05-11 10:09:56
  • 如何判断js脚本加载完成

    2008-11-04 13:53:00
  • ORACLE应用经验(1)

    2010-07-31 12:53:00
  • 浅析Go语言中的Range关键字

    2024-02-10 10:57:42
  • Vue elementUI 自定义表单模板组件功能实现

    2023-07-02 16:37:46
  • Python退出时强制运行一段代码的实现方法

    2021-02-07 08:04:16
  • python通过配置文件共享全局变量的实例

    2023-06-08 03:10:29
  • asp之家 网络编程 m.aspxhome.com