GENGEN
主页
vuepress
  • GIT命令
  • python+django
  • vue cli搭建项目
  • babel es6转换es5
  • docker aliyun配置
  • npm 配置
  • linux 常用命令
  • Ubuntu 下Linux 命令
  • github
  • gitee
  • csdn
  • 关于我
主页
vuepress
  • GIT命令
  • python+django
  • vue cli搭建项目
  • babel es6转换es5
  • docker aliyun配置
  • npm 配置
  • linux 常用命令
  • Ubuntu 下Linux 命令
  • github
  • gitee
  • csdn
  • 关于我
  • java基础

    • JDK8 函数式编程
    • JDK8 新特性之Date-Time
    • Servlet 源码分析
    • ArrayList 源码
    • LinkedList 源码
    • HashMap 源码
    • String 源码
    • BigDecimal 源码
    • java 类的加载
    • Class 源码
    • Synchronized锁升级
    • 事务的传播机制
    • knowledge
  • JAVA WEB

    • Java Servlet
    • 权限设计
    • logback日志的链路追踪
  • DATABASE

    • MySQL EXPLAIN详解
    • MySQL 索引
    • MySQL 表锁、行锁
    • MySQL ACID与transcation
    • 分布式事务
    • MySQL MVCC机制
    • Mysql 乐观锁与悲观锁
    • 分布式锁1 数据库分布式锁
    • 分布式锁2 Redis分布式锁
    • 分布式锁3 ZK分布式锁
  • SpringCloud

    • SpringCloud服务注册中心之Eureka
    • SpringCloud服务注册中心之Zookeeper
    • SpringCloud服务调用之Ribbon
    • SpringCloud服务调用之OpenFeign
    • SpringCloud服务降级之Hystrix
    • SpringCloud服务网关之Gateway
    • SpringCloud Config分布式配置中心
    • SpringCloud服务总线之Bus
    • SpringCloud消息驱动之Stream
    • SpringCloud链路追踪之Sleuth
    • SpringCloud Alibaba Nacos
    • SpringCloud Alibaba Sentinel
  • Spring

    • SpringBoot
    • Spring-data-jpa入门
    • SpringCloud问题
    • dispatcherServlet 源码分析
    • @SpringBootApplication注解内部实现与原理
    • spring启动初始化初始化
  • 中间件

    • 分布式协调服务器Zookeeper
    • 服务治理Dubbo
    • 分布式配置管理平台Apollo
    • 消息中间件框架Kafka
    • 分布式调度平台ElasticJob
    • 可视化分析工具Kibana
    • ElacticSearch 基础
    • ElacticSearch进阶
    • ElacticSearch集成
  • 环境部署

    • 应用容器引擎Docker
    • DockerCompose服务编排
    • 负载均衡Nginx
    • Nginx的安装配置
    • K8S基础
  • 代码片段

    • listener 监听模式
    • spingboot 整合redis
    • XSS过滤
    • profile的使用
    • ConfigurationProperties注解
  • 设计模式

    • 工厂模式
    • 单例模式
    • 装饰者模式
    • 适配器模式
    • 模板方法模式
    • 观察者模式
  • 读书笔记

    • 《Spring in Action 4》 读书笔记
    • 《高性能mysql》 读书笔记
  • NoSQL

    • Redis基础
    • Redis高级
    • Redis集群
    • Redis应用
  • MQ

    • rabbitMQ基础
    • rabbitMQ高级
    • rabbitMQ集群
  • JVM

    • JVM体系架构概述
    • 堆参数调整
    • GC 分代收集算法
    • JVM 垃圾回收器
    • JVM 相关问题
  • JUC

    • JUC总览
    • volatile关键字
    • CAS
    • ABA问题
    • collections包下线程安全的集合类
    • Lock 锁
    • LockSupport
    • AQS
    • Fork/Join分支框架
    • JUC tools
    • BlockingQueue 阻塞队列
    • Executor 线程池
    • CompletableFuture
    • 死锁以及问题定位分析
  • Shell

    • shell命令
    • shell基础
  • Activiti

    • IDEA下的Activiti HelloWord
    • 流程定义的CRUD
    • 流程实例的执行
    • 流程变量
  • VUE

    • vue基础
    • vue router
    • Vuex
    • Axios 跨域
    • dialog 弹出框使用
    • vue 动态刷新页面
    • vue 封装分页组件
    • vue 动态菜单
    • vue 常用传值
  • Solidity 智能合约

    • Solidity 基础
    • Solidity ERC-20
    • Solidity 101
  • English

    • 时态

如何设计权限管理模块如何设计权限管理模块 -[转载]

我们比较常见的就是基于角色的访问控制,用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间、角色与权限之间,通常都是多对多的关系。如下图: dock 基于这个,得先了解角色到底是什么?我们可以理解它为一定数量的权限的集合,是一个权限的载体。

例如:一个论坛的“管理员”、“版主”,它们都是角色。但是所能做的事情是不完全一样的,版主只能管理版内的贴子,用户等,而这些都是属于权限,如果想要给某个用户授予这些权限,不用直接将权限授予用户,只需将“版主”这个角色赋予该用户即可。

但是通过上面我们也发现问题了,如果用户的数量非常大的时候,就需要给系统的每一个用户逐一授权(分配角色),这是件非常繁琐的事情,这时就可以增加一个用户组,每个用户组内有多个用户,除了给单个用户授权外,还可以给用户组授权,这样一来,通过一次授权,就可以同时给多个用户授予相同的权限,而这时用户的所有权限就是用户个人拥有的权限与该用户所在组所拥有的权限之和。用户组、用户与角色三者的关联关系如下图: dock 通常在应用系统里面的权限我们把它表现为菜单的访问(页面级)、功能模块的操作(功能级)、文件上传的删改,甚至页面上某个按钮、图片是否可见等等都属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。 如下图: dock

Tips

这里特别需要注意以下权限表中有一列“PowerType(权限类型)”,我们根据它的取值来区分是哪一类权限,可以把它理解为一个枚举,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。

这样设计的好处有两个: 一、不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?);
二、方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串即可。

需要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。

这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。最后扩展出来的模型完整设计如下图: dock

Tips

注意上面我额外增加了一个操作日志表;

随着系统的日益庞大,为了方便管理,如果有需要可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。

例如:当遇到有多个子公司,每个子公司下有多个部门,这是我们就可以把部门理解为角色,子公司理解为角色组,角色组不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。

1.用户表:userInfo

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: 用户ID | ID | BINGINT | pk not null 用户名 | USER_NAME | VACHAR | not null

2.角色表:Role

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: 角色ID | ID | BIGINT | pk not null 角色名 | ROLE_NAME | VACHAR | not null

3.用户与角色关联表 User_Role

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 用户ID | USER_ID | BIGINT | fk not null 角色ID | ROLE_ID | BIGINT | fk not null

4.用户组表 UserGroup

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 用户组名 | USER_GROUP_NAME | VARCHAR | not null

5.用户组与用户信息关联表 UserGroup_UserInfo

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 用户组ID | USER_GROUP_ID | BIGINT | fk not null 用户ID | USER_ID | BIGINT | fk not null

6.用户组与角色关联表 UserGroup_Role

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 用户组ID | USER_GROUP_ID | BIGINT | fk not null 角色ID | ROLE_ID | BIGINT | fk not null

7.菜单表 Menu

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 菜单名称 | MENU_NAME | BIGINT | not null 菜单URL | URL | VARCHAR | not null 菜单父ID | PARENT_ID | BIGINT | not null

8.页面元素表 PageElement

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 页面元素名称 | PAGE_ELEMENT_NAME | VARCHAR | not null

9.文件表 File

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 文件名称 | FILE_NAME | VARCHAR | not null 文件路径 | FILE_PATH | VARCHAR | null

10.权限表 Permission

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 权限类型 | PERMISSION_TYPE | VARCHAR | not null

11.权限与菜单关联表 Permission_Menu

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 权限ID | PERMISSION_ID | BIGINT | fk not null 菜单ID | MENU_ID | BIGINT | fk not null

12.权限与页面元素关联表 Permission_Page

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 权限ID | PERMISSION_ID | BIGINT | fk not null 页面元素ID | PAGE_ELEMENT_ID | BIGINT | fk not null

13.权限与文件关联表 Permission_File

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 权限ID | PERMISSION_ID | BIGINT | fk not null 文件ID | FILE_ID | BIGINT | fk not null

14.功能操作表 Operation

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 操作名称 | OPERATION_NAME | VARCHAR | not null 操作编码 | OPERATION_CODE | VARCHAR | null 拦截URL前缀 | LJ_URL | VARCHAR | null 操作父ID | PARENT_ID | BIGINT |

15.权限与功能操作关联表 Permission_Operation

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 权限ID | PERMISSION_ID | BIGINT | fk not null 操作ID | OPERATION_ID | BIGINT | fk not null

16.角色与权限关联表 Role_Permission

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 角色ID | ROLE_ID | BIGINT | fk not null 权限ID | PERMISSION_ID | BIGINT | fk not null

17.操作日志表 Operation_Log

字段名称 | 字段 | 类型 | 备注

  • | :-: | :-: | :-: | -: ID | ID | BIGINT | pk not null 操作类型ID | OPERATION_ID | BIGINT | fk not null 操作内容 | OPERATION_CONTENT | VARCHAR | 操作用户ID | USER_ID | BIGINT | fk not null 操作时间 | OPERATION_TIME | TIMESTAMP |
Last Updated:
Contributors: 88395515
Prev
Java Servlet
Next
logback日志的链路追踪