django通用权限控制框架
在web项目中根据不同的用户肯定会限制其不同的权限,利用以下模块可以满足日常几乎所有的权限控制
permission_hook.py # 自定义权限控制,必须返回True/false ,True表示允许,false 拒绝
permission_list.py #根据url,访问方法及参数控制用户权限
permissions.py #先判断用户是否拥有permission_list.py中的权限,如果验证通过最后验证用户自定义权限。
实例:
permission_hook.p:
def check_self_user(request):
'''
用户只能筛选自己的客户 '''
if request.GET.get('consultant') == str(request.user.id):
return True
if request.GET.get('consultant'):
print('禁止查看非自己的客户')
return False return True
permission_list.py #根据url,访问方法及参数控制用户权限
from kingadmin import permission_hook
permission_dict={ 'crm_table_obj_list':['table_obj_list','GET',[],{},permission_hook.check_self_user],
'crm_table_obj_view':['table_obj_change','GET',[],{}],
'crm_table_obj_change':['table_obj_change','POST',[],{}]
}
permissions.py
from django.core.urlresolvers import resolve
from kingadmin.permission_list import permission_dict
from django.shortcuts import redirect,render,HttpResponse
from django.utils.safestring import mark_safe def check_permission(*args,**kwargs):
request=args[]
request_url=resolve(request.path).url_name
match_key=None
args_check=None
kwarg_check=None
if request.user.is_authenticated() is False:
return redirect('/login/') for permission_key,val in permission_dict.items():
print('执行args 权限检查-------------')
per_url=val[]
per_method=val[]
per_args=val[]
per_kwargs=val[]
per_hook_func=val[] if len(permission_dict[permission_key]) > else None if request_url == per_url:
if request.method == per_method:
args_check=False
for arg in per_args:
request_func=getattr(request,per_method)
if request_func.get(arg,None):
args_check=True
print('存在arg参数')
else:
print('不存在指定arg参数')
args_check=False
break
else:
print('未作权限限制,,默认通过')
args_check=True
kwarg_check=False for arg_name,arg_val in per_kwargs.items():
print('执行 kwargs 权限检查-------------')
request_func=getattr(request,per_method)
if request_func.get(arg_name) == str(arg_val):
kwarg_check=True
else:
kwarg_check=False
break
else:
kwarg_check=True
print('未作 kwargs 限制,默认通过') per_func=False
print('执行用户自定义钩子函数')
if per_hook_func:
per_func=per_hook_func(request)
else:
per_func=True per_res=[args_check,kwarg_check,per_func]
if all(per_res):
match_key=permission_key
print('权限匹配结果:',per_res)
break if all(per_res):
appname,*per_name=match_key.split('_')
per_obj='%s.%s'%(appname,match_key) if request.user.has_perm(per_obj):
print('所有权限检查通过')
return True
else:
print('权限检查未通过')
return False
else:
print('未匹配到权限')
return False def check_per(func):
def inner(*args,**kwargs):
if not check_permission(*args,**kwargs):
return HttpResponse(mark_safe('<h1>403 你没有相应的权限</h1>'))
else: return func(*args,**kwargs)
return inner
最后只需在views中将要使用权限控制功能的地方加上装饰器即可:
from kingadmin.permissions import check_per @check_per
def table_obj_change(request):
pass
django通用权限控制框架的更多相关文章
- vue-quasar-admin 一个包含通用权限控制的后台管理系统
vue-quasar-admin Quasar-Framework 是一款基于vue.js开发的开源的前端框架, 它能帮助web开发者快速创建以下网站:响应式网站,渐进式应用,手机应用(通过Cor ...
- Flex-Security权限控制框架
转自:http://code.google.com/p/flex-security/ flex UI组件权限控制框架 一.快速开始 1) 下载并添加flex_security.swf在你的flex l ...
- 3YAdmin-专注通用权限控制与表单的后台管理系统模板
3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及 ...
- WPF权限控制框架——【4】抛砖引玉
写第一篇"权限控制框架"系列博客是在2021-01-29,在这不到一个月的时间里,收集自己零碎的时间,竟然写出了一个"麻雀虽小,五脏俱全"的权限控制框架:对于一 ...
- django web 自定义通用权限控制
需求:web系统有包含以下5个url,分别对于不同资源: 1.stu/add_stu/ 2.stu/upload_homework/ 3.stu/query_homework/ 4.stu/add_r ...
- 权限控制框架Shiro简单介绍及配置实例
Shiro是什么 http://shiro.apache.org/ Apache Shiro是一个非常易用的Java安全框架,它能提供验证.授权.加密和Session控制.Shiro非常轻量级,而且A ...
- 权限控制框架Spring Security 和Shiro 的总结
关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...
- django中权限控制到按钮级别
权限控制到按钮级别 : 1.思路 : 由于每个按钮都能认为是一个权限,所以每个按钮都会有一个自己的路径,这些路径都在用户登录时保存在了session ...
- 了解权限控制框架shiro 之实际应用.
Apache Shiro 1.权限控制分为 a.粗粒度 URL 级别权限控制 b.细粒度方法级别权限控制 2.使用shiro进行权限控制主要有四种主要方式 : a. 在程序中 通过 Subje ...
随机推荐
- SQL Server 2000详细安装过程及配置
说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,虽然现如今SQL Server 2000软件早已经过时了,但仍然有一部分人在使用它,尤 ...
- Scrapy爬取遇到的一点点问题
学了大概一个月Scrapy,自己写了些东东,遇到很多问题,这几天心情也不大好,小媳妇人也不舒服,休假了,自己研究了很久,有些眉目了 利用scrapy 框架爬取慕课网的一些信息 步骤一:新建项目 scr ...
- Android 接收系统广播(动态和静态)
1.标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播信息,它们之间没有先后顺序.效率高.无法被截断. 2.有序广播:是一种同步执行的广播,在广播发出后 ...
- is_valid校验机制
先来归纳一下整个流程 (1)首先is_valid()起手,看seld.errors中是否值,只要有值就是flase(2)接着分析errors.里面判断_errors是都为空,如果为空返回self.fu ...
- 13LaTeX学习系列之---LaTeX插入表格
目录 目录 前言 (一)插入表格的基础语法 1.说明 2.源代码 3.输出效果 (二)查看文档 目录 本系列是有关LaTeX的学习系列,共计19篇,本章节是第13篇. 前一篇:12LaTeX学习系列之 ...
- 【转】handbrake使用教程
原文地址http://tieba.baidu.com/p/2399590151?pn=1 现在的很多压制教程基本都是使用megui或者mediacoder的,这两个软件使 ...
- Sudoku 个人项目1
Github项目地址:Github 项目相关要求 随机构造出N个不重复的已解答的数独棋盘(0 < N <= 1000000) 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 ...
- Django之Form进阶
s6day76 内容回顾: Form组件: - 类 继承Form - 字段 字段 - 实例化 - is_valid() - cleaned_data - errors Form 组件: ...
- centos7下安装docker(12.4容器如何与外部进行通信)
1.容器如何访问外部 前面我们做了很多试验:只要host能连外网,使用默认bridge(docker0)创建得容器就能访问外网,那么容器是怎样访问外网的呢? 注:这里的外网不仅是internet,包括 ...
- ansible-task模块写法归类
转载: https://blog.csdn.net/pushiqiang/article/details/78249665