rbac-基于角色的权限控制系统(8种常用场景再现)
首先要抛出的问题是在代码世界里什么是权限?
- url就代表权限
如何实现权限控制?
下面详细介绍控制流程
1.1简单权限控制--表结构
简单权限控制,三个model,五张表
权限表permission
- url 权限 url的地址 正则表达式 ^$
- title 标题
角色表role
- name 角色名称
- permissions 多对多 关联权限表
用户表user
- username 用户名
- password 密码
- roles 多对都 关联角色
角色和权限的关系表
用户和角色的关系表
1.2 一级菜单--表结构
一级菜单: 在permission表中增加is_menu字段,区别该权限是否是菜单
权限表
url 权限 url的地址 正则表达式 ^$
title 标题
is_menu 是否是菜单
icon 图标
1.3 二级菜单--表结构
二级菜单: 实现二级菜单功能时,需要增加第六张表menu,在权限表中加入外键,关联menu表,有menu_id 当前的权限是二级菜单 没有menu_id 当前的权限是普通的权限
菜单表
- title 一级菜单的名称
- icon 图标
权限表
url 权限 url的地址 正则表达式 ^$
title 标题
menu 外键 关联菜单表 有menu_id 当前的权限是二级菜单 没有menu_id 当前的权限是普通的权限
1.4 二级菜单 对一级菜单进行排序--表结构
要对一级菜单排序,在menu中加入weight权重字段
菜单表
title 一级菜单的名称
icon 图标
weight 整型
1.5 非菜单 权限归属
权限归属,在menu表中加入parent外键,自关联权限表, 有parent_id当前的权限是子权限, 没有parent_id 当前的权限是父权限 ,即二级菜单
权限表
- url 权限 url的地址 正则表达式 ^$
- title 标题
- menu 外键-关联菜单表 有menu_id 当前的权限是二级菜单 没有menu_id 当前的权限是普通的权限
- parent 外键-关联权限表-自关联, 有parent_id 当前的权限是子权限 没有parent_id 当前的权限是父权限 二级菜单
--表结构:
menu 菜单表
- title 标题
- icon 图标
- weight 权限
permission 权限表
url 权限,url路径,正则表达式 ^$
title 标题
name url的别名, 唯一
menu 外键,--关联菜单表,blank=True,null=True , (二级菜单使用)
- 存在menu_id,当前的权限是二级菜单,
- 没有menu_id当前的权限是普通权限
parent 自关联, (非菜单权限归属使用)
- 有menu_id 的就是子权限
- 没有parent_id就是父权限
is_menu 布尔值,一级菜单使用的
icon,一级菜单使用的
role 角色表
- name 角色的名称,
- permission 多对多,关联权限表
user用户表
- username 用户名
- password 密码
role_permission角色与权限的关系表
user_role 用户与角色的关系表
--数据结构(流程+技术点)
1. 简单的权限控制
登陆成功后保存权限信息到session中
权限数据结构
permission_list = [{url},]
中间件-
-(校验成功,return None,校验失败继续执行)- 获取当前访问的url路径
- 白名单校验
- 登录状态的校验
- 免认证的地址校验
- 权限的校验
- 从sission中获取权限
- 循环权限,正则匹配
模板
- 母版和继承
2. 动态生成一级菜单
登录成功保存用户权限到sission中
权限数据结构
permission_list=[{url},]
菜单数据结构
menu_list=[{url:,title:,icon:,},]
中间件
校验成功,return None,校验失败继续执行- 获取当前访问的url路径
- 白名单校验
- 登录状态校验
- 免认证路径的校验
- 权限的校验
- 从session中获取权限
- 循环权限,正则匹配
母版
- inclusion_tag
- 动态生成一级菜单
- 定义inclusion_tag
- yi曾for循环men_list,生成一级菜单
3. 动态生成二级菜单
登录成功后保存用户权限到session
权限列表数据结构
permission_list ={{url:,},}
菜单字典数据结构
menu_dict={一级菜单ID:{
title:
icon:
children:[{
url:
title:
},]
},}
中间件
- 获取当前访问的url路径
- 白名单校验
- 登录状态校验
- 免认证路径的校验
- 权限校验
- 从session中获取权限
- 循环权限,正则匹配
模板
模板和继承
动态生成二级菜单
自定义inclusion_tag
两层for循环menu_dict.values()
4. 动态生成二级菜单(一级菜单排序)
登录成功获取用户权限保存到sission中
权限列表数据结构
permission_list= [{url},]
菜单字典数据结构
menu_dict = {一级菜单的id:{
title:
icon:
weight:
children:[{
url:
title:
},]
},}
中间件
- 中间件
- 获取当前访问的url路径
- 白名单校验
- 登录状态校验
- 免认证路径的校验
- 权限校验
- 从session中获取权限
- 循环权限,正则匹配
- 中间件
模板
母版和继承
生成二级菜单并对一级菜单排序
自定义inclusion_tag
sorted对menu_diact字典排序,添加到有序字典od
两层for循环,返回有序字典od.values(),
5. 动态生成二级菜单(二级菜单默认选中,展开)
登录成功后保存用户权限到session
权限列表数据结构
permission_list = [{url}]
菜单字典的数据结构
menu_dict= {一级菜单id:{
title:
icon:
weight:
children:[{
url:
title:
},]
},}
中间件
- 获取当前访问的url地址路径
- 白名单校验
- 登录状态检验
- 免认证地址校验
- 权限校验
- 从session中获取权限
- 循环权限,正则匹配
模板
- 母版和继承
- 动态生成二级菜单,并排序,展开
- 自定义inclusion_tag
- 获取当前url
- sorted对menu_diact字典排序,添加到有序字典od
- 循环一级菜单,加入class='hide'
- 循环二级菜单,正则匹配url,如果匹配成功
- 二级菜单加class='active'
- 一级菜单class=''
- 两层for循环,返回有序字典od.values()
6. 动态生成二级菜单(非菜单权限归属,子权限选中二级菜单展开)
登录成功后保存用户权限到session
权限列表数据结构
permission_list = [{
url:
id:
pid:
},]
菜单字典数据结构
menu_dict = {一级菜单id:{
title:
icon:
weight:
children:[{
url:
title:
id:
},]
},}
中间件
- 获取当前访问的url路径
- 白名单校验
- request.current_menu_id = None ---当访问index免认证地址时,保证全部二级菜单闭合
- 登录状态的校验
- 免认证的校验
- 权限的校验
- 从sission中获取取消权限
- 循环权限,正则匹配
- 获取权限列表中的id和pid
- 当pid不存在时,当前权限是一个二级菜单,把id封装到request中,request.current_menu_id=id --current 当前--
- 当pid存在时,当前权限是一个二级菜单,把pid,即耳机菜单的id封装到requst中,request.current_menu_id=pid
模板
母版与继承
生成二级菜单,子权限选中二级菜单展开
自定义inclussion_tag
获取当前url
sorted 对一级菜单排序,添加到有序字典od
循环一级菜单,加入class='hide'
循环二级菜单,判断request.current_menu_id与二级菜单中的id是否相等
- 相等时给该二级菜单加入class='active',移除一级菜单中的hide类,class=''
两层for循环,返回od.values()
7. 路径导航
登录成功保存用户权限到sission中
权限字典数据结构
permission_dict ={权限id:{ # 可以根据子权限的pid获取父权限的字典
url:,
id:,
pid:,
title:,
},}
菜单字典数据结构
menu_dict = {一级菜单id:{
title:
icon:
weight:
children:[{
url:
title:
id:
},]
},}
中间件
- 获取当前访问的url路径
- 白名单校验
- request.current_menu_id=None ---当访问index免认证地址时,保证全部二级菜单闭合
- request.breadcrumb_list =[{'title':'主页','url':'/index/'},] ---添加免认证信息到路径导航
- 登录状态校验
- 免认证地址校验
- 权限校验
- 从sission中获取权限
- 循环权限permissions_dict.vlaues,正则匹配
- 获取id和pid
- 如果pid不存在是一个二级菜单,
- request.current_menu_id = id
- 封装该二级菜单信息--request.breadcurmb_list.append({'title':i['title'],'url':i['url']})
- 如果pid存在,是一个子权限
- 父权限p_permissions = permissions_dict[str('dict')]
- request.current_menu_id = pid
- 封装该二级菜单信息--request.breadcurmb_list.append({'title':p_permissions['title'],'url':p_permissions['url']})
- 封装子权限菜单信息--request.breadcurmb_list.append({'title':i['title'],'url':i['url']})
- 如果pid不存在是一个二级菜单,
模板
母版和继承
生成二级菜单,子权限选中二级菜单展开
自定义inclussion_tag
获取当前url
sorted 对一级菜单排序,添加到有序字典od
循环一级菜单,加入class='hide'
循环二级菜单,判断request.current_menu_id与二级菜单中的id是否相等
- 相等时给该二级菜单加入class='active',移除一级菜单中的hide类,class=''
两层for循环,返回od.values()
路径导航
- 自定义inclusion_tag
- 获取breadcurmb_list= request.breadcrumb_list
- 一层for循环 request.breadcrumb_list
8. 权限控制到按钮级别
登录成功之后保存用户权限到session
权限字典数据结构
permisssions_dict={url别名:{
url:
id:
pid:
pname:
},}
菜单字典数据结构
menu_dict = {一级菜单id:{
title:
icon:
weight:
children:[{
url:
title:
id:
},]
},}
中间件
获取当前访问的url路径
白名单校验
request.current_menu_id=None
request.breadcrumb_list=[{'tittle':'主页','url':'/index/'},]
登录状态校验
- 从sission中获取权限
- 循环权限permissions_dict.vlaues,正则匹配
- 获取id和pid
- 如果pid不存在,当前url就是二级菜单
- request.current_menu_id = id
- request.breadcrumb_list.append({'title':i['title'],'url':i['url']})
- 如果pid存在,当前url就是子权限
- 获取父权限(二级菜单)信息 p_permissions = permissions_dict[i['pname']]
- request.current_menu_id = pid
- request.breadcrumb_list.append({'title':p_permissions['title'],'url':p_permissions['url']})
- request.breadcrumb_list.append({'title':i['title'],'url':i['url']})
- 如果pid不存在,当前url就是二级菜单
模板
母版和继承
生成二级菜单/一级菜单排序/非菜单权限归属,子权限选中二级菜单展开
自定义inclussion_tag
获取当前url
sorted 对一级菜单排序,添加到有序字典od
循环一级菜单,加入class='hide'
循环二级菜单,判断request.current_menu_id与二级菜单中的id是否相等
- 相等时给该二级菜单加入class='active',移除一级菜单中的hide类,class=''
两层for循环,返回od.values()
路径导航
- 自定义inclusion_tag
- 获取breadcurmb_list= request.breadcrumb_list
- 一层for循环 request.breadcrumb_list
权限控制到按钮
- 自定义filter --has_permission
- 判断前端传过来的name in permission_dict,
- 存在返回True
- 不存在返回False
- 在html文件中作判断{% if request|has_permission: name %} { % endif %}
rbac-基于角色的权限控制系统(8种常用场景再现)的更多相关文章
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...
- ASP.net MVC 基于角色的权限控制系统的实现
一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...
- RBAC基于角色的权限访问控制
RBAC是什么,能解决什么难题?ThinkPHP中RBAC实现体系安全拦截器认证管理器访问决策管理运行身份管理器ThinkPHP中RBAC认证流程权限管理的具体实现过程RBAC相关的数据库介绍Th ...
- 项目:rbac 基于角色的权限管理系统;
- 简单示意流程图 - RBAC分析: - 基于角色的权限管理: - 权限等于用户可以访问的URL: - 通过限制URL来限制权限: - RBAC表结构组成: from django.db impor ...
- RBAC基于角色的权限管理模型
一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...
- 基于角色的权限控制系统(role-based access control)
role-based access control(rbac),指对于不同角色的用户,拥有不同的权限 .用户对应一个角色,一个角色拥有若干权限,形成用户-角色-权限的关系,如下图所示.当一个用户进行访 ...
- RBAC 基于角色的权限管理的简单实现
1.什么是权限管理,权限管理就是对后台功能的细分,和对不同工作人员划分不同的工作的管理 RBAC是如何实现的,通过对不同控制器和控制器不同方法的限制,实现的管理. 要实现RBAC需要三张表,一张用户表 ...
- RBAC - 基于角色的权限控制
ThinkPHP中关于RBAC使用详解 自己的源码下载:百度网盘,thinkPHP文件夹下,RBAC文件夹. 重要的是,权限信息的写入函数等.在源码中能找到,Modules/Amin/Common/c ...
- RBAC: K8s基于角色的权限控制
文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...
随机推荐
- openpyxl模块的读写使用及mongodb概念
今日内容概要 openpyxl模块 MongoDB数据库 今日内容详细 openpyxl模块 # 下载 pip3 install openpyxl # 使用 '''openpyxl内部读写也是分离的 ...
- JAVA——类与对象
目录 类与对象 一.类 二.对象 2.1对象的内存布局形式 三.类与对象 3.1如何创建 3.2如何访问属性 3.2类与对象的分配机制 3.2.1Java内存的结构分析 注意事项和细节 类与对象 为什 ...
- 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...
- CPU乱序执行基础 —— Tomasulo算法及执行过程
朋友们可以关注下我的公众号,获得最及时的更新: IBM 360/91浮点单元最先实现Tomasulo算法从而允许乱序执行.360体系只有4个双精度浮点寄存器,限制了编译器调度的有效性.而且,IBM 3 ...
- Spring入门笔记简要
总览:https://www.processon.com/view/link/605b14ab5653bb2225e6b0c5 一.Spring 1.概述 1.spring框架简介 为简化企业级开 ...
- springboot-jta-atomikos多数据源事务管理
背景 我们平时在用springboot开发时,要使用事务,只需要在方法上添加@Transaction注解即可,但这种方式只适用单数据源,在多数据源下就不再适用: 比如在多数据源下,我们在一个方法里执行 ...
- emu8086实现两位数加法运算
题目说明:给出一个公式,例如 "35 + 28 = ",输出计算结果 一.准备材料 DOS功能调用表:https://blog.csdn.net/mybelief321/artic ...
- Windows10 1809版本Windows自动更新服务无法禁用问题解决方案
症状 Windows Update服务已经在服务管理器中禁用,但是莫名奇妙的会被自动设置为手动,并会自动下载补丁.原因 微软加强了系统更新服务的保护措施,导致按照原有的禁用服务方法,能够随时被恢复.解 ...
- 设计模式在 Spring 中的应用
Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫 ...
- ASP.NET Core 6 Minimal API的模拟实现
Minimal API仅仅是在基于IHost/IHostBuilder的服务承载系统上作了小小的封装而已,它利用WebApplication和WebApplicationBuilder这两个类型提供了 ...