对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分

Django对于权限这块的部分验证方法

1 user = request.user
2 user.is_superuser  #是否是超级管理员
3 user.s_anonymous()  #是否匿名用户,及未登录用户
4 user.groups.select_related()  #获取用户对应的组角色对象,
5 #当获取到group后,通过group.name获取组名,

下面是一段完整的权限控制例子

  1 #!/usr/bin/env python
  2 # encoding:utf8
  3
  4 from django.core.urlresolvers import resolve
  5 from django.shortcuts import render
  6
  7
  8 # 定义角色权限
  9 roles = {
 10     'consultant': ['Customer', 'ConsultRecord'],
 11     'teachers': ['Course', 'ClassList', 'CourseRecord', 'StudyRecord'],
 12     'students':  ['StudyRecord'],
 13 }
 14 # 权限映射
 15 permission_map = {
 16     'view_home': ['index', 'GET', []],  # 展示对应对可操作对象
 17     'view_object': ['admin_controller', 'GET', ['show']],  # 查看具体对象对数据信息
 18     'edit_object': ['admin_controller', 'POST', ['show', 'id']],  # 具有编辑该对象对权限
 19     'add_object_view': ['admin_controller', 'GET', ['add']],  # 进入添加页面,但不表示可以进行修改,该权限用于对表格显示字段过长,显示不全,可以进入该页面查看
 20     'add_object': ['admin_controller', 'POST', ['add']],  # 具有添加该对象对权限
 21     'delete_object': ['admin_controller', 'POST', ['show', 'data']],  # 具有删除该对象对权限
 22 }
 23
 24
 25 def check_process(*args, **kwargs):
 26     request = args[0]
 27     user = request.user
 28     if user.is_superuser:
 29         return True
 30     resolver_match_obj = resolve(request.path)
 31     url_name = resolver_match_obj.url_name
 32     args = list(resolver_match_obj.args)
 33     args.extend(request.GET)
 34     args.extend(request.POST)
 35     print('begin checking permission ', resolver_match_obj)
 36     if url_name:
 37         is_match = False
 38         match_perm = None
 39         for permission in permission_map:
 40             permission_action = permission_map[permission]  # 获取url对应的权限动作
 41             print('----------------url action: ', permission_action)
 42             if len(permission_action) == 3:  # 为保障下面语句执行不为语法而被破坏,加上该条件,强制性判断,否则放行
 43                 define_url_name, define_request_method, define_others = permission_action
 44                 if url_name == define_url_name:
 45                     print("match url name: ", define_url_name)
 46                     if request.method == define_request_method:
 47                         print("match method: ", define_request_method)
 48                         if define_others:  # 如果定义了具体参数匹配,则继续匹配参数
 49                             print("check others: ", permission, define_others)
 50                             for arg in define_others:
 51                                 if hasattr(request, str(define_request_method)):
 52                                     request_method = getattr(request, str(define_request_method))  # 获取对应的请求方法对象
 53                                     if hasattr(request_method, arg) or arg in args:  # 如果能匹配参数,则标记匹配
 54                                         is_match = True
 55                                         print("others match: ", arg)
 56                                     else:
 57                                         print("others not match: ", arg)
 58                                         is_match = False
 59                             if is_match:
 60                                 print("others match done: ", permission, permission_action)
 61                                 match_perm = permission
 62                                 break
 63                         else:
 64                             is_match = True
 65                             match_perm = permission
 66                             print("url check done ...", permission, permission_action)
 67                             break
 68             else:
 69                 print('please check the define rules, maybe has some problem')
 70                 return True  # 如果定义的动作不完整,为避免新增权限的缺陷影响业务,这种错误应该放行处理
 71     else:
 72         return True  # 如果没有找到对应的url name则放行处理
 73
 74     if is_match:
 75         print("begin check user permission ...")
 76         if user.is_anonymous():
 77             print("user has not login ...")
 78             return True  # 如果用户是匿名,说明该页面可能不需要权限控制,放行处理,假如该view需要登录认证,那么再次权限处理时,不会在此处理
 79         elif user.has_perm('%s.%s' % (__package__, match_perm)):
 80             groups = user.groups.select_related()
 81             model_list = []
 82             for group in groups:
 83                 if group.name in roles:
 84                     model_list.extend(roles[group.name])
 85             if args and len(args) > 1:  # 如果URL获取到参数,则对参数进行比较
 86                 access_model = args[0]
 87                 if access_model not in model_list:  # 该操作主要拦截,直接使用URL方式而非超链接,尝试指定不同model访问其它数据
 88                     return False
 89                 return True
 90             return model_list if model_list else True  # 如果model_list为空,且该用户还有权限,那么只有超级用户才有这种特权了
 91     return False
 92
 93
 94 def decorator(func):
 95     def wrapper(*args, **kwargs):
 96         check_result = check_process(*args, **kwargs)
 97         if not check_result:
 98             render_respond = render(args[0], '403.html')
 99             render_respond.status_code = 403  # 修改头部信息状态码
100             print("permission refused ...")
101             return render_respond
102         if type(check_result) is list:  # 该参数仅在本次view中可能有用,所以在return时需要尝试捕获,如果出错,则尝试移除该key,再返回,再有其它错误,就可以排除是该权限控制产生的了
103             kwargs['model_list'] = check_result
104         print('permission check passed...')
105         try:
106             return func(*args, **kwargs)
107         except TypeError:
108             kwargs.pop('model_list')
109             return func(*args, **kwargs)
110     return wrapper

转载于:https://www.cnblogs.com/zengchunyun/p/5552733.html

Django 权限管理相关推荐

  1. Django 权限管理-后台根据用户权限动态生成菜单

    Django权限管理 实现目标: 1.管理用户,添加角色,用户关联角色 2.添加权限.角色关联权限 3.添加动作.权限关联动作 4.添加菜单.权限关联菜单 实现动态生成用户权限菜单(可设置多级菜单嵌套 ...

  2. django权限管理

    当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...

  3. 基于Django实现RBAC权限管理

    概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际 ...

  4. django自带的权限管理Permission用法

    Permission的用法 前言 默认的权限(add, change, delete, view) 使用方法 在函数中验证权限,使用user.has_perm 验证函数是否有执行权限,使用@permi ...

  5. django认证系统实现自定义权限管理的方法 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文记录使用django自带的认证系统实现自定义的权限管理系统,包含组权限.用户权限等实现. 0x01. django认 ...

  6. django权限系统实现步骤_Django权限机制的实现

    django-permission 本文涉及的技术,已应用于我基于django 1.8+ 开发的博客系统--MayBlog,欢迎交流. 1. Django权限机制概述 权限机制能够约束用户行为,控制页 ...

  7. python开发信息系统权限设置_[Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 主要内容 什么是权限管理? Web 权限 Django 权限机制 Django ...

  8. django 用户管理相关的表

    Django 用户管理相关的表: create table django_content_type (/*内容类型表*/id int(11) not null auto_increment,app_l ...

  9. django权限二(多级菜单的设计以及展示)

    多级权限菜单设计级标题栏 我们现在只有数据展示,要进入其他url还需要手动的输入路径,非常的麻烦,所以我们要设计 一个导航栏以及侧边多级菜单栏,这个展示是通过stark组件的设计的增删改查页面,而 每 ...

最新文章

  1. Arm 发布Mali多媒体套件,机器学习将不再是高端手机的专享
  2. RxJava zip 使用
  3. vuex的命名空间有哪些_vuex模块化和命名空间的实例代码
  4. 游戏企业的“逆袭”,从用好这套解决方案开始 →
  5. java数位倒置递归_有人能解释一下这个递归代码如何在java中反转int吗?
  6. php显示json,PHP解决JSON中文显示问题
  7. 小创意,大世界——休闲游戏开发者指南
  8. 信息学奥赛一本通C++语言——1001:Hello,World!
  9. windows的libcurl下zlib1.dll问题
  10. Ardusub源码解析学习(二)——电机库
  11. Win10操作系统备份与恢复篇·Windows10操作系统如何使用微PE实现备份与恢复
  12. android9彩蛋小米触发不了,小米9成功运行基于Android Q的MIUI系统:初版BUG较多
  13. 几何分布(一种离散分布)
  14. ORACLE 金额转大写中文
  15. FineBI帮助文档一眼尽收眼底
  16. 车载GNSS/INS/LiDAR坐标系定义与理解
  17. win7蓝屏_win7蓝屏如何修复
  18. 读《如果蜗牛有爱情》上下册
  19. Blink SQL之创建日志服务SLS源表
  20. 求正弦函数sin(x)的近似值的多项式求解

热门文章

  1. 全能HOOK框架 JNI NATIVE JAVA ART DALVIK
  2. 实现AIDL接口的Binder连接池
  3. NOIP2018比赛总结
  4. vc6 前进后退 番茄_openMP 使用 VC6+Intel Compiler 9.1 (来自网络)
  5. 看漫画学python pdf下载_看漫画还能学Python❓❓❓| 0基础小白福音
  6. uva1504(模拟+暴力)
  7. wifi定位算法 java_记一次APP的so层算法逆向(七)
  8. python tkinter 背景色改变不了_python – 在Tkinter中动态更改小部件背景颜色
  9. python表示数字6_【第六节】Python数字(Number)
  10. java有向图邻接表入度_图的实现--邻接表(求出各顶点的出度和入度)