细粒度权限控制之基本概念篇
背景: 在开发后台管理页面的某一天,有了个想法,期望页面的一些菜单或者按钮,可以根据一些表里数据来控制其是否展示,顺序,菜单名。
在参考了众多文章和源码,有了自己的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 这张表同时保存 角色主键和权限主键 来维护 角色和权限之间多对多的关系。