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

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

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

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

 #!/usr/bin/env python
# encoding:utf8 from django.core.urlresolvers import resolve
from django.shortcuts import render # 定义角色权限
roles = {
'consultant': ['Customer', 'ConsultRecord'],
'teachers': ['Course', 'ClassList', 'CourseRecord', 'StudyRecord'],
'students': ['StudyRecord'],
}
# 权限映射
permission_map = {
'view_home': ['index', 'GET', []], # 展示对应对可操作对象
'view_object': ['admin_controller', 'GET', ['show']], # 查看具体对象对数据信息
'edit_object': ['admin_controller', 'POST', ['show', 'id']], # 具有编辑该对象对权限
'add_object_view': ['admin_controller', 'GET', ['add']], # 进入添加页面,但不表示可以进行修改,该权限用于对表格显示字段过长,显示不全,可以进入该页面查看
'add_object': ['admin_controller', 'POST', ['add']], # 具有添加该对象对权限
'delete_object': ['admin_controller', 'POST', ['show', 'data']], # 具有删除该对象对权限
} def check_process(*args, **kwargs):
request = args[0]
user = request.user
if user.is_superuser:
return True
resolver_match_obj = resolve(request.path)
url_name = resolver_match_obj.url_name
args = list(resolver_match_obj.args)
args.extend(request.GET)
args.extend(request.POST)
print('begin checking permission ', resolver_match_obj)
if url_name:
is_match = False
match_perm = None
for permission in permission_map:
permission_action = permission_map[permission] # 获取url对应的权限动作
print('----------------url action: ', permission_action)
if len(permission_action) == 3: # 为保障下面语句执行不为语法而被破坏,加上该条件,强制性判断,否则放行
define_url_name, define_request_method, define_others = permission_action
if url_name == define_url_name:
print("match url name: ", define_url_name)
if request.method == define_request_method:
print("match method: ", define_request_method)
if define_others: # 如果定义了具体参数匹配,则继续匹配参数
print("check others: ", permission, define_others)
for arg in define_others:
if hasattr(request, str(define_request_method)):
request_method = getattr(request, str(define_request_method)) # 获取对应的请求方法对象
if hasattr(request_method, arg) or arg in args: # 如果能匹配参数,则标记匹配
is_match = True
print("others match: ", arg)
else:
print("others not match: ", arg)
is_match = False
if is_match:
print("others match done: ", permission, permission_action)
match_perm = permission
break
else:
is_match = True
match_perm = permission
print("url check done ...", permission, permission_action)
break
else:
print('please check the define rules, maybe has some problem')
return True # 如果定义的动作不完整,为避免新增权限的缺陷影响业务,这种错误应该放行处理
else:
return True # 如果没有找到对应的url name则放行处理 if is_match:
print("begin check user permission ...")
if user.is_anonymous():
print("user has not login ...")
return True # 如果用户是匿名,说明该页面可能不需要权限控制,放行处理,假如该view需要登录认证,那么再次权限处理时,不会在此处理
elif user.has_perm('%s.%s' % (__package__, match_perm)):
groups = user.groups.select_related()
model_list = []
for group in groups:
if group.name in roles:
model_list.extend(roles[group.name])
if args and len(args) > 1: # 如果URL获取到参数,则对参数进行比较
access_model = args[0]
if access_model not in model_list: # 该操作主要拦截,直接使用URL方式而非超链接,尝试指定不同model访问其它数据
return False
return True
return model_list if model_list else True # 如果model_list为空,且该用户还有权限,那么只有超级用户才有这种特权了
return False def decorator(func):
def wrapper(*args, **kwargs):
check_result = check_process(*args, **kwargs)
if not check_result:
render_respond = render(args[0], '403.html')
render_respond.status_code = 403 # 修改头部信息状态码
print("permission refused ...")
return render_respond
if type(check_result) is list: # 该参数仅在本次view中可能有用,所以在return时需要尝试捕获,如果出错,则尝试移除该key,再返回,再有其它错误,就可以排除是该权限控制产生的了
kwargs['model_list'] = check_result
print('permission check passed...')
try:
return func(*args, **kwargs)
except TypeError:
kwargs.pop('model_list')
return func(*args, **kwargs)
return wrapper

Django 权限管理的更多相关文章

  1. 【Python】django权限管理

    参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...

  2. Django 权限管理(二)

    权限菜单展示 1.展示的效果 实现该效果,涉及到的核心点(突破点) 1. 权限分类: (1)菜单权限 (主要用来展示的权限(url)如查看权限 url,  如上图中的每个权限都归类为菜单权限,主要用来 ...

  3. django权限管理(一)

    权限:权限就是一个包含正则的url. Rbac 权限管理: Role-Based Access Control,基于角色的访问控制.用户通过角色与权限进行关联,一个用户可以有多个角色,一个角色可以有多 ...

  4. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  5. Django权限管理测试

    测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...

  6. django权限管理

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

  7. Django之权限管理

    Django权限管理之初步完整版 项目背景:这是一个权限管理系统(给一些角色和他们的权限指URL和页面可以删除的按钮比如:增删改查) 使用到了中间件,和初始化权限,使用了admin的后台管理系统. 我 ...

  8. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  9. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

随机推荐

  1. CPUID指令简单调用

    关于CPUID指令,可以看维基百科的相关介绍 https://en.wikipedia.org/wiki/CPUID 在windows下可以调用__cpuid和__cpuidex这两个函数,__cpu ...

  2. smali调试总结

    一. 开始调试 smali调试从最早的重打包用各种JAVA IDE进行调试, 到后来的可以不用重打包用xposed插件, 在到最后的修改系统源码刷机或者修改boot.img刷机一劳永逸 apk可调试可 ...

  3. 在CentOS下搭建自己的Git服务器

    首先需要装好CentOS系统,作为测试,你可以选择装在虚拟机上,这样比较方便.这步默认你会,就不讲了.有了CentOS,那么如何搭建Git服务器呢?1.首先需要安装Git,可以使用yum源在线安装: ...

  4. 写一个js向左滑动删除 交互特效的插件——Html5 touchmove

    需求描述 需要实现类似QQ中对联系人的操作:向左滑动,滑出删除按钮.滑动超过一半时松开则自动滑到底,不到一半时松开则返回原处. 纯js实现 使用了h5的touchmove等事件,以及用js动态改变cs ...

  5. connect-flash 中间件

    http://blog.csdn.net/liangklfang/article/details/51086607

  6. js_原型

    原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"prototype"属性,函数对象有"prototype"属性,原型对象有&q ...

  7. lanmp之二 (奇葩问题)

    ps:该篇是接 lanmp -- 动静分离 lanmp -- 奇葩问题 话说,在 搭建 bbs.abc.com (discuz论坛)的 时候.... 1.说明:web机器上以前已经有一个 discuz ...

  8. 网络请求 __ NSURLSession

    首先配置into.plist文件 1. 添加 App Transport Security Settings , Type栏自动变为Dictionary 2. 点击左边箭头,使之向下,点击右边加号,添 ...

  9. Linux中文件颜色所代表的属性和颜色

    绿色文件: 可执行文件,可执行的程序    红色文件:压缩文件或者包文件   蓝色文件:目录   白色文件:一般性文件,如文本文件,配置文件,源码文件等    浅蓝色文件:链接文件,主要是使用ln命令 ...

  10. 《ASP.NET MVC高级编程(4版)》读书笔记(5)表单和HTML辅助方法

    5.1 表单使用 5.1.1 action 和 method 特性 <form action="/Home/Index">     <input name=&qu ...