欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

细粒度权限控制之基本概念篇

程序员文章站 2022-07-14 15:33:01
...

       背景: 在开发后台管理页面的某一天,有了个想法,期望页面的一些菜单或者按钮,可以根据一些表里数据来控制其是否展示,顺序,菜单名。

       在参考了众多文章和源码,有了自己的idea并进行实操后,有了属于自己的一套细粒度权限控制的解法。

       这篇文章将对用户,角色,权限这几张表和关系进行详细的介绍,主要是为了将细粒度权限控制的思路介绍给各位,而不是简单丢下代码的那种,个人觉得代码只是一种让思路落地的工具,相比于 源代码更重要的是对这种情况下的个人思路和体会。

       可以确定的是读者如果认真阅读本系列文章后,将对细粒度权限控制的解法有了深刻的体悟,后面可以开创属于个人一套独有的细粒度权限控制。

       首先涉及到 权限控制那么必然要涉及到 用户、角色、权限 这几个定义, 可以通过一句话来介绍这几个关系, 每个人在生活中都 拥有着多个角色(父亲/孩子/上班者), 每个角色下又拥有着 多个职能 。 是不是挺好理解的,

       可以看出来 用户和角色的关系是 多对多,一个用户可以关联多个角色,一个角色也可以关联多个用户;角色和权限的关系是多对多,一个角色可以有多个权限, 一个权限也可以关联多个权限。

       上面是用户,角色,权限的理论介绍,那么落地到数据表是什么情况呢? 根据这些关系,我们讲创建5张表进行维护这些关系。

              a. WU_SYS_USER 用户表 、

              b. WU_SYS_ROLE 角色表 、

              c. WU_SYS_ROLE_USER 用户和角色关系维护表 、

              d. WU_SYS_PERMISSION 权限表 、

              e. WU_SYS_ROLE_PERMISSION 角色和权限关系维护表

    下面是具体的 sql 语句 :

# a.  WU_SYS_USER  用户表  
CREATE TABLE `WU_SYS_USER` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `USERNAME` VARCHAR(50) COLLATE utf8_bin NOT NULL COMMENT '用户名',
  `PHONE` VARCHAR(20) COLLATE utf8_bin NOT NULL COMMENT '手机号',
  `PASSWORD` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL COMMENT '密码',
  `IMG_URL` VARCHAR(100) COLLATE utf8_bin DEFAULT NULL COMMENT '照片',
  `RKSJ` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL COMMENT '入库时间',
  PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户表'
# b.  WU_SYS_ROLE 角色表
CREATE TABLE `WU_SYS_ROLE` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `NAME` varchar(50) COLLATE utf8_bin NOT NULL COMMENT 'NAME',
  `DESCRIPTION` varchar(20) COLLATE utf8_bin NOT NULL COMMENT '描述',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色表'
# c. WU_SYS_ROLE_USER 用户和角色关系维护表
CREATE TABLE `WU_SYS_ROLE_USER` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `USER_ID` int(11) NOT NULL COMMENT '用户ID',
  `ROLE_ID` int(11) NOT NULL COMMENT '角色ID',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户-角色关联表'
# d.  WU_SYS_PERMISSION 权限表 
CREATE TABLE `WU_SYS_PERMISSION` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `PARENT_ID` int(11) DEFAULT NULL COMMENT '上级菜单',
  `NAME` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '菜单名',
  `URL` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '权限链接',
  `PERMISSION` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '资源标识',
  `TYPE` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '类型 0菜单,1按钮',
  `SORT` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='权限表'
# e.  WU_SYS_ROLE_PERMISSION 角色和权限关系维护表
 CREATE TABLE `WU_SYS_ROLE_PERMISSION` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `ROLE_ID` int(11) NOT NULL COMMENT '角色ID',
  `PERMISSION_ID` int(11) NOT NULL COMMENT '权限ID',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1642 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色-用户关联表'

            我们使用 WU_SYS_ROLE_USER 这张表同时保存 用户主键和角色主键 来维护 用户和角色之间多对多的关系, 使用 WU_SYS_ROLE_PERMISSION 这张表同时保存 角色主键和权限主键 来维护 角色和权限之间多对多的关系。