首先要抛出的问题是在代码世界里什么是权限?

  • 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']})
  • 模板

    • 母版和继承

    • 生成二级菜单,子权限选中二级菜单展开

      • 自定义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']})
  • 模板

    • 母版和继承

    • 生成二级菜单/一级菜单排序/非菜单权限归属,子权限选中二级菜单展开

      • 自定义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种常用场景再现)的更多相关文章

  1. ASP.NET MVC 基于角色的权限控制系统的示例教程

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

  2. ASP.net MVC 基于角色的权限控制系统的实现

    一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...

  3. RBAC基于角色的权限访问控制

      RBAC是什么,能解决什么难题?ThinkPHP中RBAC实现体系安全拦截器认证管理器访问决策管理运行身份管理器ThinkPHP中RBAC认证流程权限管理的具体实现过程RBAC相关的数据库介绍Th ...

  4. 项目:rbac 基于角色的权限管理系统;

    - 简单示意流程图 - RBAC分析: - 基于角色的权限管理: - 权限等于用户可以访问的URL: - 通过限制URL来限制权限: - RBAC表结构组成: from django.db impor ...

  5. RBAC基于角色的权限管理模型

    一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...

  6. 基于角色的权限控制系统(role-based access control)

    role-based access control(rbac),指对于不同角色的用户,拥有不同的权限 .用户对应一个角色,一个角色拥有若干权限,形成用户-角色-权限的关系,如下图所示.当一个用户进行访 ...

  7. RBAC 基于角色的权限管理的简单实现

    1.什么是权限管理,权限管理就是对后台功能的细分,和对不同工作人员划分不同的工作的管理 RBAC是如何实现的,通过对不同控制器和控制器不同方法的限制,实现的管理. 要实现RBAC需要三张表,一张用户表 ...

  8. RBAC - 基于角色的权限控制

    ThinkPHP中关于RBAC使用详解 自己的源码下载:百度网盘,thinkPHP文件夹下,RBAC文件夹. 重要的是,权限信息的写入函数等.在源码中能找到,Modules/Amin/Common/c ...

  9. RBAC: K8s基于角色的权限控制

    文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...

随机推荐

  1. RFC2889错误帧过滤测试----网络测试仪实操

    一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...

  2. Zabbix——可视化的资源监控解决方案

    Zabbix监控的内容 1.硬件监控 温度 磁盘.主板等故障 待机时间 2.系统监控 CPU 内存 负载 磁盘 内核参数 网卡流量 TCP连接数 进程数 IO 端口采集 3.程序 应用:Nginx.m ...

  3. Java课程设计---安装解压版mysyql

    1.解压 将mysql-5.7.13-winx64.rar解压到C盘根目录.(将原有data文件夹清空,注意是清空,不是删除data文件夹) 2. 配置环境变量MYSQL_HOME (参照java打开 ...

  4. 通过对比语法差异,让会JAVA的你快速学会Kotlin的开源宝藏项目

    今天有个小伙伴来问TJ君,说自己JAVA用的贼溜,想再学习下Kotlin,问TJ君上手难不难? 怎么说呢?其实TJ君一直觉得语言这方面,是触类旁通.一通百通的,既然JAVA已经贼溜了,想必学其他的语言 ...

  5. C#控制台窗口禁用关闭按钮

    1 public class Program 2 { 3 #region 禁用控制台黑窗口的关闭按钮 part1 4 5 private const int MF_BYCOMMAND = 0x0000 ...

  6. Azure DevOps (二) 实现Git仓库和钉钉的联动

    上一篇文章中我们提到了azure为我们提供了可自定的web hook,于是我打算实践一下 我假设了一种场景就是,我希望我可以及时收到团队中所有开发人员的代码提交记录,于是乎我想通过web hook打通 ...

  7. GPG入门尝试

    GPG入门尝试 参考:阮一峰的网络日志 在所附链接中,对大多数信息的解释说明已经较为详细,在此只补充实际操作中的一些问题和解决方法 gpg --decrypt demo.en.txt --output ...

  8. 题解 CF17E 【Palisection】

    卡空间PAM,2010没有PAM,所以都是马拉车 众所周知,PAM拥有十分优秀的时间复杂度,但空间复杂度lj得不行 但这题卡空间,所以得用到邻接链表PAM 先讲思路 题目要求相交的回文子串对,这很难做 ...

  9. Java 反射的用法 有关Class类的解释

    package com.imooc.test;public class ClassDemo1 { public static void main(String[] args) { Foo fool = ...

  10. For循环案例练习一基础版

    输出1-10之间的数据 1 public class LX1 { 2 public static void main(String[] args) { 3 for (int x=1;x<=10; ...