Django_RBAC_demo2 升级版权限控制组件
RBAC 升级版
预期要求
前端在无权限时不在提供操作标签
更改部分硬编码
实现更加精准的权限控制
未改动前的版本
在这里 ⬇
Django_rbac_demo 权限控制组件框架模型
具体更改
数据库结构更改:
对 permission 表新增两个字段 用于分类具体控制表(group) 以及当前操作行为 (action)
增加新表 permissiongroup 用来保存控制表字段
models.py
from django.db import models# Create your models here.class User(models.Model):name = models.CharField(max_length=32)pwd = models.CharField(max_length=32)roles = models.ManyToManyField(to="Role")def __str__(self): return self.nameclass Role(models.Model):title = models.CharField(max_length=32)permissions = models.ManyToManyField(to="Permission")def __str__(self): return self.titleclass Permission(models.Model):title = models.CharField(max_length=32)url = models.CharField(max_length=32)action = models.CharField(max_length=32, default="1")group = models.ForeignKey("PermissionGroup", default=1)def __str__(self):return self.titleclass PermissionGroup(models.Model):title = models.CharField(max_length=32)def __str__(self): return self.title
permission.py
表结构更改后,后台可利用的数据更多。传回一个字典。
以及需要 数据处理成便于操作的形式
""" 为了解耦,将处理权限的代码保存在组件里面 """def initial_session(user,request):"""方案1不好用,只用一个权限字段实在功能有限 已被淘汰"""# # 查看当前用户的所有的权限# # 因为会有values 的原理会导致有重复需要去重# ret = user.roles.all().values("permissions__url").distinct()# permission_list = []# # 将所有的权限保存在一个列表里面,稍微处理下数据便于操作# for i in ret:# permission_list.append(i["permissions__url"])# # 把用户的用户权限保存在 session 里面# request.session["permission_list"] = permission_list"""方案2"""# permission__group_id permission表 的group 字段 因为外键会后面加个 ”_id“ 别忘了啊# 取出来当前用户的权限,每个权限对应的属性permissions = user.roles.all().values("permissions__url","permissions__group_id","permissions__action",).distinct()# 对拿到的数据进行数据处理permission_dict = {}for i in permissions:gid = i["permissions__group_id"]if gid not in permission_dict:permission_dict[gid] = {"urls": [i["permissions__url"], ],"actions": [i["permissions__action"], ]}else:permission_dict[gid]["urls"].append(i["permissions__url"])permission_dict[gid]["actions"].append(i["permissions__action"])request.session["permission_dict"] = permission_dict
rbac.py
对传回的数据进行权限验证
import re from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse, redirect""" 写在中间件里面可以完全避免每次都要重复校验的问题 在请求来的时候进行校验,因此要写在 process_request 方法里面 """class ValidPermission(MiddlewareMixin):def process_request(self, request):# 当前访问路径current_path = request.path_info"""检查是否属于白名单admin 的内部流程不允许一上来就访问首页,必须要跳转到 登陆页面http://127.0.0.1:8000/admin/login/?next=/admin/第二次跳转到登录页面的请求如果没有被定义可通过就会被拦截无法只使用 admin 为过滤选项不能用 in 单纯的判断,还是要用到正则处理需要放过所有 admin 开头的 url"""valid_url_list = ["/login/", "/reg/", "/admin/.*"]for valid_url in valid_url_list:ret = re.match(valid_url, current_path)if ret:# 中间件 return None 表示这个中间件已经执行完毕return None"""校验是否登录对于没有登陆的用户返回报错应该是让他去登陆"""user_id = request.session.get("user_id")if not user_id:return redirect("/login/")# """# 校验权限 1 permission_list# 在编辑,以及删除页面的时候 url 不是固定的,# 会有内含的参数,因此权限列表里面不能仅仅是写死的url# 也不能再单纯的用 in 来判断。还是要靠正则来处理# 将权限列表里面的权限信息用 正则表达式来保存# 然后对访问页面进行验证是否可以通过来处理# """# permission_list = request.session.get("permission_list",[])# flag = False# for permission in permission_list:# permission = "^%s$" % permission# ret = re.match(permission, current_path)# if ret:# flag = True# break# if not flag:# return HttpResponse("没有访问权限!")# return None"""校验权限 2 permission_dict"""permission_dict = request.session.get("permission_dict")for i in permission_dict.values():urls = i["urls"]for reg in urls:reg = f"^{reg}$"ret = re.match(reg, current_path)if ret:# 加一个自定义的 actions 属性在里面request.actions = i["actions"]return Nonereturn HttpResponse("没有访问权限!")
views.py
封装一个 Per 类便于前端更方便的取数据
from django.shortcuts import render,HttpResponse import re # Create your views here. from rbac.models import * from rbac.service.perssions import *class Per():def __init__(self,actions):self.actions = actionsdef add(self):return "add" in self.actionsdef delete(self):return "del" in self.actionsdef edit(self):return "edit" in self.actionsdef cat(self):return "cat" in self.actionsdef users(request):user_list = User.objects.all()# permission_dict = request.session["permission_dict"]# 查询当前登陆人的名字id = request.session.get("user_id")user = User.objects.filter(id=id).first()per = Per(request.actions)return render(request, "users.html",locals())def add_user(request):permission_list = request.session["permission_list"]return HttpResponse("add user.....")def del_user(request,id):return HttpResponse(f"del_user: {id}")def roles(request):role_list = Role.objects.all()per = Per(request.actions)return render(request,"roles.html",locals())def login(request):print("login")if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")# 拿到当前用户对象user = User.objects.filter(name=user, pwd=pwd).first()if user:# 把用户的id 保存在 session 里面request.session["user_id"] = user.pk# 查询当前用户的所有的权限 initial_session(user, request)return HttpResponse("登录成功!")return render(request, "login.html",locals())
users.html
前端页面基于 per 对象的 actions 控制才判断是否对标签进行显示
{% extends "base.html" %} {% block con %}<h4>用户列表</h4>{% if per.add %}<a href="/users/add/" class="btn btn-primary">添加用户</a>{% endif %}<table class="table table-bordered table-striped"><thead><tr><th>序号</th><th>姓名</th><th>角色</th><th>操作</th></tr></thead><tbody>{% for user in user_list %}<tr><td>{{ forloop.counter }}</td><td>{{ user.name }}</td><td>{% for role in user.roles.all %}{{ role.title }}{% endfor %}</td><td>{% if per.delete%}<a href="/users/delete/{{ user.pk }}/" class="btn btn-danger">删除</a>{% endif %}{% if per.edit %}<a href="" class="btn btn-warning">编辑</a>{% endif %}</td></tr>{% endfor %}</tbody></table> {% endblock %}
转载于:https://www.cnblogs.com/shijieli/p/10184948.html
Django_RBAC_demo2 升级版权限控制组件相关推荐
- 如何在自己的信息管理系统里集成第三方权限控制组件 - 设计一个漂亮的WEB界面...
我们大家都梦想有个完美的各种信息管理系统,其实一个人又会数据库,又会C#.NET程序,还要精通HTML,还要精通CSS,更要精通JS,还有精力去写很多东西,又要调试前台又要调试后台,而且每开发一个系统 ...
- Yii权限控制组件authManager使用思想RBAC
0.思想 角色与权限表父子关系表 角色与权限表描述表 角色与用户对应表 如果要能对任何⽤户进⾏权限检查,需要调⽤yii\rbac\ManagerInterface::checkAccess()⽅法就可 ...
- 使用开源权限控制组件search-guard来操作Elasticsearch
一.集群级别权限 1.原来自定义角色sg_zyl_role,只有对所有索引有all操作权限,对集群级别权限没有 # zyl脚本可以监控集群,只能对customer索引有操作权限 sg_zyl_role ...
- ant design pro (十六)advanced 权限管理
一.概述 原文地址:https://pro.ant.design/docs/authority-management-cn 权限控制是中后台系统中常见的需求之一,你可以利用我们提供的权限控制组件,实现 ...
- asp.net core 使用 AccessControlHelper 控制访问权限
asp.net core 使用 AccessControlHelper 控制访问权限 Intro 由于项目需要,需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权 ...
- RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能
RDIFramework.NET V2.9版本 WinFom部分新增与修正的功能 转眼间RDIFramework.NET框架走了快6个年头了,随着一个版本一个版本的升级改造,现在已经越来越完美了.使 ...
- 完美的项目从完美的表开始
表结构设计 一.权限控制表结构设计 UserInfo ScoreRecord Attendance Team Department Role Permission Menu 二.业务表结构设计 Use ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本强势发布
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chinahuyong/article/details/51290832 继上个版本"RDI ...
- RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)...
RDIFramework.NET-.NET快速信息化系统开发整合框架 [开发实例 EasyUI]之产品管理(MVC版) RDIFramework.NET-.NET快速开发整合框架 [开发实例]之产品管 ...
最新文章
- Google 希望将 Go 打造成云端应用开发的首选语言
- 粘贴铜箔简易实验电路制作
- linux ubuntu 开机自动启动 fixfox 并打开指定网站
- SQL语句查询出的数据进行字符串拼接,oracle批量删除数据库用户实例演示
- 【solr专题之三】Solr常见异常
- java okhttp3 工具类,Retrofit+okhttp+Rxjava网络请求工具类
- 基于JAVA+SpringBoot+Mybatis+MYSQL的疫情信息管理系统
- linux用户态使用gpio中断方法
- Enterprise Library:DAAB + OLEDB/ODBC操作Access数据库
- Winform文件下载之断点续传
- 嵌入式-第一季-第4课
- Python学习---Python数据类型1206
- 9款超级好看有创意的表白网页源码
- 美团团购订单系统优化记
- 2021抖音上热门技巧有哪些?
- 泰坦尼克号生存预测python_用Python预测泰坦尼克号生存情况
- android开发便签实验报告,什么是艾宾浩斯遗忘曲线?利用这一记忆规律可以提升孩子记忆力...
- 项目管理杂谈-需求无止境
- elementUI 相同元素合并行
- Python 股票分析快速入门
热门文章
- 灵魂拷问!软件架构师书籍
- java 2017腾讯面试题_腾讯2017刁难面试题,是不是大神就看你会做几题
- 从未在一起更让人遗憾_科比生涯4大遗憾,只有1个MVP,错过保罗,跟腱撕裂再无传奇...
- 一次选中多个物体_经验之谈|Anchor Boxes:物体检测的关键
- python server酱_用Python抢到回家的车票,so easy
- 1个ieee1394端口_5G新在哪儿(6)?-天线端口的故事
- android select下拉列表_Python+selenium自动化之下拉列表操作(一)
- 表单html遇到的问题及处理,Html表单中遇到的问题
- Vue终端取消vue、prettier警告warn
- 计算机国二笔试试题,全国计算机等考试二笔试试题(2).ppt