用户角色权限控制系统
一 概述
什么是用户角色权限控制?
用户角色权限控制,也叫做RBAC模型:Role-Based Access Control,基于角色的访问控制。
名称有点拗口,具体怎么理解呢?
重点就是这个角色。举个栗子:小王是名财务,能够审批报销单和发工资。在这个场景里,“小王”就是“用户”,“财务”就是“角色”,“审批报销单和发工资”就是“权限”,在没有引入“角色”前,权限都是直接指给用户的,就是“小王能够审批报销单和发工资”,那么这里就有问题了。
- 如果没有角色,那么拥有同样权限的人就得每个都配一遍,有人员流动时又要再配一次,很麻烦。引入“角色”后,我们把权限指派给“角色”,这样在配权限时,只需要将“用户”关联上角色就可以了。
- 到底什么样的人才能审批报销单和发工资呢?我们需要做一个归类,比如把这一批人归为财务,把那一批人归为领导亲戚,就是把拥有同样权限的人设定一个“角色”,进行归类。
整个RBAC的核心设计就是这个了。那么根据这套模型功能的复杂程度不同,由简单到复杂又可以分为RBAC-0、RBAC-1、RBAC-2、RBAC-3四个层级。
RBAC-0是最基础的,就是在用户与角色、角色与权限间建立关系,每种关系均为多对多。
练习任务
- 在数据库中完成RBAC表的设计。
- 基于RBAC模拟一个在线文档,能让不同角色拥有不同的权限去操作文档。
二 表关系设计
学习目标
- 能够使用E-R图描述RBAC系统数据库表实体关系。
内容讲解
1 E-R 图
E-R图为实体-联系图,提供了表示实体型(表)、属性和联系的方法,用来描述现实世界的概念模型。实体关系图可以表示数据在数据库中的存储模型。
E-R图为实体-联系图的构成
- 实体型(Entity)
用矩形表示,矩形框内写明实体名;比如学生张三丰、学生李寻欢都是实体。
- 属性(Attribute)
用椭圆形表示,并用无向边将其与相应的实体连接起来;比如学生的姓名、学号、性别、都是属性。
- 联系(Relationship)
用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型(1 : 1,1 : n或m : n)就是指存在的三种关系(一对一,一对多,多对多)。 比如老师给学生授课存在授课关系,学生选课存在选课关系。
2 RBAC 实体分析
用户,角色,权限之间的关系如下所示:
用户选用角色,一个用户可以有多个角色,一个角色可以被多个用户选用,用户和角色之间是多对多的关系,
角色拥有权限,一个角色可以有多个权限,一个权限可以被多个角色拥有,角色和权限之间也是多对多的关系。
因此,可以设计如下ER图表示:
一个实体就表示一张表,属性就是对应的表字段。当我们能够看懂E-R图时,我们就可以根据E-R图去设计数据库的表了。
再结合我们之前的表设计原则设计表就行了:
- 一对一关系:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE
外键是主键:主表的主键和从表的主键,形成主外键关系
- 一对多关系:
在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键.
- 多对多关系:
需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
因此设计表的时候,用户和角色之间要一张描述用户与角色关系的表,角色和权限之间要一张描述角色和权限关系表,一共5张表。
3 RBAC 表设计
创建表的sql语句
-- 1.用户表t_user
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT comment '用户编号', -- 用户编号
`username` varchar(32) DEFAULT NULL comment '用户名字', -- 用户名字
`password` varchar(32) DEFAULT NULL comment '用户密码', -- 用户密码
`remark` varchar(32) DEFAULT NULL comment '用户备注', -- 用户备注
`email` varchar(32) DEFAULT NULL comment '用户邮箱', -- 用户邮箱
`createTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP comment '该用户创建时间', -- 该用户创建时间
`updateTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '该用户修改时间', -- 该用户修改时间
PRIMARY KEY (`id`) -- 设置主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- timestamp 表示时间戳 年月日 时分秒
-- ----------------------------
-- Records of t_user
-- ----------------------------
insert into t_user values(null,'admin','123',null,'admin@163.com',null,null)
,(null,'zhansan','123',null,'zhansan@163.com',null,null),(null,'lisi','123',null,'lisi@163.com',null,null),(null,'wangwu','123',null,'wangwu@163.com',null,null),(null,'zhaoliu','123',null,'zhaoliu@163.com',null,null),(null,'tianqi','123',null,'tianqi@163.com',null,null),(null,'柳岩','123',null,'liuyan@163.com',null,null),(null,'杨幂','123',null,'yangmi@163.com',null,null),(null,'李沁','123',null,'liqin@163.com',null,null),(null,'赵丽颖','123',null,'zhaoliying@163.com',null,null);
-- 2.角色表t_role
CREATE TABLE `t_role` (
`id` int(11) NOT NULL AUTO_INCREMENT comment '角色id', -- 角色id
`name` varchar(32) DEFAULT NULL comment '角色名字', -- 角色名字
`keyword` varchar(64) DEFAULT NULL comment '角色关键字', -- 角色关键字
`description` varchar(128) DEFAULT NULL comment '角色描述', -- 角色描述
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_role
-- ----------------------------
INSERT INTO `t_role` VALUES ('1', '管理员', 'ROLE_ADMIN', '这是管理员')
,('2', '会员', 'ROLE_MEMBER', '这是会员')
,('3', '游客', 'ROLE_VISITOR', '这是游客');
-- 3.权限表
CREATE TABLE `t_permission` (
`id` int(11) NOT NULL AUTO_INCREMENT comment '权限编号', -- 权限编号
`name` varchar(32) DEFAULT NULL comment '权限名字', -- 权限名字
`keyword` varchar(64) DEFAULT NULL comment '权限关键字', -- 权限关键字
`description` varchar(128) DEFAULT NULL comment '权限描述', -- 权限描述
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_permission
-- ----------------------------
INSERT INTO `t_permission` VALUES ('1', '新增', 'ITEM_ADD', '这是新增权限')
,('2', '删除', 'ITEM_DELETE', '这是删除权限')
,('3', '编辑', 'ITEM_EDIT', '这是编辑权限')
,('4', '查询', 'ITEM_QUERY', '这是查询权限');
-- 4.用户角色中间表
CREATE TABLE `t_user_role` (
`user_id` int(11) NOT NULL comment '用户',
`role_id` int(11) NOT NULL comment '角色',
PRIMARY KEY (`user_id`,`role_id`),
KEY `FK_Reference_8` (`role_id`),
CONSTRAINT `FK_Reference_7` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`),
CONSTRAINT `FK_Reference_8` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_user_role
-- ----------------------------
INSERT INTO `t_user_role` VALUES ('1', '1'),('2', '2'),('1', '2'),('3', '2'),('4', '1'),('5', '2'),('6', '1'),('7', '3'),('8', '1'),('9', '3'),('10', '1'),('8', '2'),('9', '1'),('10', '2');
-- 5.角色权限中间表
CREATE TABLE `t_role_permission` (
`role_id` int(11) NOT NULL comment '角色',
`permission_id` int(11) NOT NULL comment '权限',
PRIMARY KEY (`role_id`,`permission_id`),
KEY `FK_Reference_12` (`permission_id`),
CONSTRAINT `FK_Reference_11` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`),
CONSTRAINT `FK_Reference_12` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_role_permission
-- ----------------------------
INSERT INTO `t_role_permission`
VALUES ('1', '1'),('1', '2'),('1', '3'),('1', '4'),('2', '3'),('2', '4'),('3', '4');
创建好表之间的关系图:
内容小结
我们可以使用E-R图设计实体关系。参照实体关系可以设计表。
三 项目说明
1 项目概述
根据用户的角色不同去操控文档。角色-权限如下。
角色 | 权限 |
---|---|
管理员 | 新增 删除 编辑 查询 |
会员 | 编辑 查询 |
游客 | 查询 |
新增权限:允许新建文档。
删除权限:允许删除文档。
编辑权限:允许编辑文档。
查询权限:允许查阅文档。
2 项目要求
- 要求有登入功能,用户数据来自数据库。
- 登入成功后,如果用户有多重角色,要求能够选择角色进入程序。
- 进入程序主界面后要求能够根据角色,显示所有该角色的权限操作选项。
- 用户可以选择不同功能进行操作。
四 项目开发
1.创建maven工程
2.导入依赖
<!--依赖-->
<dependencies>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--<version>4.13</version>-->
<version>4.13</version>
<!--范围:测试存在-->
<!--<scope>test</scope>-->
</dependency>
<!--mybatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!--logback日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
<!--导入插件-->
<!--配置maven的插件-->
<build>
<plugins>
<!--配置的是jdk编译器-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!-- 配置成自己的JDK版本 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3.导入配置文件
logback.xml
mybatis-config.xml
自己创建jdbc.properties文件
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/数据库名
jdbc.driver=com.mysql.jdbc.Driver
阅读参考附件项目代码,完成,并完善该项目相关功能。
附件:rbac-system-01.zip
导入后需要修改的两个地方:
- jdbc.properties 文件
- 项目的jdk。打开pom.xml来,找到build
任务
- 把项目导入到idea中去,修改相关的配置。
- 把整体项目的功能逻辑理清楚。
- 根据自己的理解,参考项目实现该系统
参考以下步骤实现: