django web 自定义通用权限控制
需求:web系统有包含以下5个url,分别对于不同资源;
1、stu/add_stu/
2、stu/upload_homework/
3、stu/query_homework/
4、stu/add_record/
--------------------------------------------------------------------------------------------------------
学生可以访问:2,3
老师可以访问:1,4
可以通过基于角色对用户权限进行控制:
一、数据模型
1、用户表:用户表和角色表为多对多关系,1个用户可以有多个角色,1个角色可以被多个用户划分;
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
password = models.CharField(_('password'),max_length=128,\
help_text=mark_safe('''<a href ="password/" >修改密码</a>'''))
name = models.CharField(max_length=32,help_text='用户登陆后请修改为真实名字')
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
role = models.ManyToManyField("Role") def __str__(self):
return self.email
2、角色表:
class Role(models.Model):
"""角色表"""
name = models.CharField(unique=True,max_length=32)
menus = models.ManyToManyField("Menu")
def __str__(self):
return self.name
3、菜单表:
class Menu(models.Model):
"""动态菜单"""
name = models.CharField(unique=True,max_length=32)
url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url')))
url_name = models.CharField(unique=True,max_length=128) def __str__(self):
return self.name
二、前端根据用户权限生成菜单
<div class="container-fluid">
<div class="row">
{% block side-bar %}
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
{% block side-bar-menus %}
{% for role in request.user.userprofile.roles.all %}
<hr>
{% for menu in role.menus.all %}
<li>
<a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}" >
{{ menu.name }}
</a>
</li>
{% endfor %}
{% endfor %}
{% endblock %}
</ul>
</div>
{% endblock %} 这样就可以根据用户生成菜单,但是如果用户不是通过菜单方法,而是直接通过url访问,后台还是没有对这些url进行控制
三、后台根据用户权限控制菜单访问
装饰器:
简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
class Mddile1(MiddlewareMixin):
def process_request(self,request):
#如果用户访问的url是登录、注册页面,记录到白名单,放行
for url in settings.PASS_URL_LIST:
if re.match(url,request.path_info):
return None
Permission_url_list=request.session.get(settings.SESSION_PERMISSION_URL_KEY)
#如果用户访问的url 不在当前用户权限之内 返回login页面
if not Permission_url_list:
return redirect(settings.LOGIN_URL)
current_url=request.path_info
#由于数据库的数据,可能是正则所有 一定要精确匹配
flag=False
for url in Permission_url_list:
url='^%s$'%(url)
if re.match(url,current_url):
flag=True
break
if not flag:
if settings.DEBUG: #如果是程序调试应该 显示用户可以访问的权限
url_html='<br/>'.join(Permission_url_list)
return HttpResponse('无权访问您可以访问%s'%url_html)
else:
return HttpResponse('没有权限')
四、后台Django 的权限项修改用户权限控制菜单访问
https://www.douban.com/note/636370355/
django web 自定义通用权限控制的更多相关文章
- vue-quasar-admin 一个包含通用权限控制的后台管理系统
vue-quasar-admin Quasar-Framework 是一款基于vue.js开发的开源的前端框架, 它能帮助web开发者快速创建以下网站:响应式网站,渐进式应用,手机应用(通过Cor ...
- 3YAdmin-专注通用权限控制与表单的后台管理系统模板
3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及 ...
- django通用权限控制框架
在web项目中根据不同的用户肯定会限制其不同的权限,利用以下模块可以满足日常几乎所有的权限控制 permission_hook.py # 自定义权限控制,必须返回True/false ,True表 ...
- Django web框架之权限管理一
1. 需求分析: 准备:创建独立app, rbac #权限管理模块/组件 app01 #应用 分配权限,URL 2. 数据库设计 2.1 设计思路 第一版: 权限表: ID url title is_ ...
- Web Service学习-CXF开发Web Service的权限控制(二)
Web Service怎样进行权限控制? 解决思路:server端要求input消息总是携带实username.password信息,假设没实username和password信息.直接拒绝调用 解决 ...
- Django 基于角色的权限控制
有一种场景, 要求为用户赋予一个角色, 基于角色(比如后管理员,总编, 编辑), 用户拥有相应的权限(比如管理员拥有所有权限, 总编可以增删改查, 编辑只能增改, 有些页面的按钮也只有某些角色才能查看 ...
- Django web框架之权限管理二
1. login登录 def login(request): if request.method=="GET": return render(request,'login.html ...
- java web 自定义的权限框架
权限框架2部分 1.认证 (通常指登录) 2.授权 (指用户访问改页面是否有权限) 设计:
- 基于MVC4+EasyUI的Web开发框架形成之旅--权限控制
我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为“用户登录身份验证” ...
随机推荐
- ArcGis融合小多边形到相邻多边形
在有的时候,我们的数据中可能会有许多细小的图斑,这些并不是我们想要的,需要将它们合并到周围的图斑中,如果一个一个手动合并,那工作量之大简直不敢想象.现在借助ArcGIS的Eliminate工具可 ...
- Concurrent.util中的一些类
package com.bjsxt.height.concurrent019; import java.io.IOException; import java.util.Random; import ...
- HTML5<canvas>标签:使用canvas元素在网页上绘制线条和圆(1)
什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...
- Reabble.com-KindleRSS新闻杂志订阅
Reabble.com-KindleRSS新闻杂志订阅 TreeInsertions Tomcat部署war包后,运行时出现如下错误 RectangularCovering Reabble.com-K ...
- BZOJ4570 SCOI2016妖怪(三分)
strength=atk*(1+b/a)+dnf*(1+a/b).设a/b=x,可以发现这是一个关于x的对勾函数.开口向上的一堆凸函数取max还是凸函数,三分即可. 然而无良出题人既卡精度又卡时间.众 ...
- [bzoj5285] [HNOI2018]寻宝游戏
Description 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生的你,对这个活动非常感兴趣. ...
- [洛谷P3834] 【模板】可持久化线段树 1(主席树)
题目大意:静态区间第K小 题解:主席树 卡点:无 C++ Code: #include <cstdio> #include <algorithm> #define maxn 2 ...
- C&C++——基本说明
预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * ...
- ansible 部署jdk
playbook 剧本如下 [root@sz_fy_virt_encrypt_33_239 x]# cat jdk.yml - hosts: web remote_user: opsadmin bec ...
- HDU1099---数学 | 思维
hdu 1099 Lottery题意:1~n编号的彩票,要买全,等概率条件下平均要买几张.已经买了m张时,买中剩下的概率为1-m/n,则要买的张数为1/(1-m/n)n=2,s=1+1/(1-1/2) ...