用户角色权限控制系统

一 概述

什么是用户角色权限控制?

用户角色权限控制,也叫做RBAC模型:Role-Based Access Control,基于角色的访问控制。

名称有点拗口,具体怎么理解呢?

重点就是这个角色。举个栗子:小王是名财务,能够审批报销单和发工资。在这个场景里,“小王”就是“用户”,“财务”就是“角色”,“审批报销单和发工资”就是“权限”,在没有引入“角色”前,权限都是直接指给用户的,就是“小王能够审批报销单和发工资”,那么这里就有问题了。

  1. 如果没有角色,那么拥有同样权限的人就得每个都配一遍,有人员流动时又要再配一次,很麻烦。引入“角色”后,我们把权限指派给“角色”,这样在配权限时,只需要将“用户”关联上角色就可以了。
    qE73kCNd6tQMv1uPv1mc.png
  2. 到底什么样的人才能审批报销单和发工资呢?我们需要做一个归类,比如把这一批人归为财务,把那一批人归为领导亲戚,就是把拥有同样权限的人设定一个“角色”,进行归类。
    CO53r2QmfXxtz8k5ZQAR.png

整个RBAC的核心设计就是这个了。那么根据这套模型功能的复杂程度不同,由简单到复杂又可以分为RBAC-0、RBAC-1、RBAC-2、RBAC-3四个层级。

RBAC-0是最基础的,就是在用户与角色、角色与权限间建立关系,每种关系均为多对多

AfDAQhgzX8Nru5g4q0MA.png

练习任务

  1. 在数据库中完成RBAC表的设计。
  2. 基于RBAC模拟一个在线文档,能让不同角色拥有不同的权限去操作文档。

二 表关系设计

学习目标

  • 能够使用E-R图描述RBAC系统数据库表实体关系。

内容讲解

1 E-R 图

E-R图为实体-联系图,提供了表示实体型(表)、属性和联系的方法,用来描述现实世界的概念模型。实体关系图可以表示数据在数据库中的存储模型。

E-R图为实体-联系图的构成

  1. 实体型(Entity)
    用矩形表示,矩形框内写明实体名;比如学生张三丰、学生李寻欢都是实体。

数据库实战 - 图5

  1. 属性(Attribute)
    用椭圆形表示,并用无向边将其与相应的实体连接起来;比如学生的姓名、学号、性别、都是属性。

数据库实战 - 图6

  1. 联系(Relationship)
    用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型(1 : 1,1 : n或m : n)就是指存在的三种关系(一对一,一对多,多对多)。 比如老师给学生授课存在授课关系,学生选课存在选课关系。

数据库实战 - 图7

2 RBAC 实体分析

用户,角色,权限之间的关系如下所示:

AfDAQhgzX8Nru5g4q0MA.png
用户选用角色,一个用户可以有多个角色,一个角色可以被多个用户选用,用户和角色之间是多对多的关系,
角色拥有权限,一个角色可以有多个权限,一个权限可以被多个角色拥有,角色和权限之间也是多对多的关系。
因此,可以设计如下ER图表示:

数据库实战 - 图9

一个实体就表示一张表,属性就是对应的表字段。当我们能够看懂E-R图时,我们就可以根据E-R图去设计数据库的表了。
再结合我们之前的表设计原则设计表就行了:

  1. 一对一关系:

外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE
外键是主键:主表的主键和从表的主键,形成主外键关系

  1. 一对多关系:

在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键.

  1. 多对多关系:

需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

因此设计表的时候,用户和角色之间要一张描述用户与角色关系的表,角色和权限之间要一张描述角色和权限关系表,一共5张表。

3 RBAC 表设计

创建表的sql语句

  1. -- 1.用户表t_user
  2. CREATE TABLE `t_user` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT comment '用户编号', -- 用户编号
  4. `username` varchar(32) DEFAULT NULL comment '用户名字', -- 用户名字
  5. `password` varchar(32) DEFAULT NULL comment '用户密码', -- 用户密码
  6. `remark` varchar(32) DEFAULT NULL comment '用户备注', -- 用户备注
  7. `email` varchar(32) DEFAULT NULL comment '用户邮箱', -- 用户邮箱
  8. `createTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP comment '该用户创建时间', -- 该用户创建时间
  9. `updateTime` timestamp not NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '该用户修改时间', -- 该用户修改时间
  10. PRIMARY KEY (`id`) -- 设置主键
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12. -- timestamp 表示时间戳 年月日 时分秒
  13. -- ----------------------------
  14. -- Records of t_user
  15. -- ----------------------------
  16. insert into t_user values(null,'admin','123',null,'admin@163.com',null,null)
  17. ,(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);
  18. -- 2.角色表t_role
  19. CREATE TABLE `t_role` (
  20. `id` int(11) NOT NULL AUTO_INCREMENT comment '角色id', -- 角色id
  21. `name` varchar(32) DEFAULT NULL comment '角色名字', -- 角色名字
  22. `keyword` varchar(64) DEFAULT NULL comment '角色关键字', -- 角色关键字
  23. `description` varchar(128) DEFAULT NULL comment '角色描述', -- 角色描述
  24. PRIMARY KEY (`id`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  26. -- ----------------------------
  27. -- Records of t_role
  28. -- ----------------------------
  29. INSERT INTO `t_role` VALUES ('1', '管理员', 'ROLE_ADMIN', '这是管理员')
  30. ,('2', '会员', 'ROLE_MEMBER', '这是会员')
  31. ,('3', '游客', 'ROLE_VISITOR', '这是游客');
  32. -- 3.权限表
  33. CREATE TABLE `t_permission` (
  34. `id` int(11) NOT NULL AUTO_INCREMENT comment '权限编号', -- 权限编号
  35. `name` varchar(32) DEFAULT NULL comment '权限名字', -- 权限名字
  36. `keyword` varchar(64) DEFAULT NULL comment '权限关键字', -- 权限关键字
  37. `description` varchar(128) DEFAULT NULL comment '权限描述', -- 权限描述
  38. PRIMARY KEY (`id`)
  39. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  40. -- ----------------------------
  41. -- Records of t_permission
  42. -- ----------------------------
  43. INSERT INTO `t_permission` VALUES ('1', '新增', 'ITEM_ADD', '这是新增权限')
  44. ,('2', '删除', 'ITEM_DELETE', '这是删除权限')
  45. ,('3', '编辑', 'ITEM_EDIT', '这是编辑权限')
  46. ,('4', '查询', 'ITEM_QUERY', '这是查询权限');
  47. -- 4.用户角色中间表
  48. CREATE TABLE `t_user_role` (
  49. `user_id` int(11) NOT NULL comment '用户',
  50. `role_id` int(11) NOT NULL comment '角色',
  51. PRIMARY KEY (`user_id`,`role_id`),
  52. KEY `FK_Reference_8` (`role_id`),
  53. CONSTRAINT `FK_Reference_7` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`),
  54. CONSTRAINT `FK_Reference_8` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`)
  55. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  56. -- ----------------------------
  57. -- Records of t_user_role
  58. -- ----------------------------
  59. 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');
  60. -- 5.角色权限中间表
  61. CREATE TABLE `t_role_permission` (
  62. `role_id` int(11) NOT NULL comment '角色',
  63. `permission_id` int(11) NOT NULL comment '权限',
  64. PRIMARY KEY (`role_id`,`permission_id`),
  65. KEY `FK_Reference_12` (`permission_id`),
  66. CONSTRAINT `FK_Reference_11` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`),
  67. CONSTRAINT `FK_Reference_12` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`)
  68. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  69. -- ----------------------------
  70. -- Records of t_role_permission
  71. -- ----------------------------
  72. INSERT INTO `t_role_permission`
  73. VALUES ('1', '1'),('1', '2'),('1', '3'),('1', '4'),('2', '3'),('2', '4'),('3', '4');

创建好表之间的关系图:
image.png

内容小结

我们可以使用E-R图设计实体关系。参照实体关系可以设计表。

三 项目说明

1 项目概述

根据用户的角色不同去操控文档。角色-权限如下。

角色 权限
管理员 新增
删除
编辑
查询
会员 编辑
查询
游客 查询

新增权限:允许新建文档。
删除权限:允许删除文档。
编辑权限:允许编辑文档。
查询权限:允许查阅文档。

2 项目要求

  1. 要求有登入功能,用户数据来自数据库。
  2. 登入成功后,如果用户有多重角色,要求能够选择角色进入程序。
  3. 进入程序主界面后要求能够根据角色,显示所有该角色的权限操作选项。
  4. 用户可以选择不同功能进行操作。

四 项目开发

1.创建maven工程

2.导入依赖

  1. <!--依赖-->
  2. <dependencies>
  3. <!--junit-->
  4. <dependency>
  5. <groupId>junit</groupId>
  6. <artifactId>junit</artifactId>
  7. <!--<version>4.13</version>-->
  8. <version>4.13</version>
  9. <!--范围:测试存在-->
  10. <!--<scope>test</scope>-->
  11. </dependency>
  12. <!--mybatis核心包-->
  13. <dependency>
  14. <groupId>org.mybatis</groupId>
  15. <artifactId>mybatis</artifactId>
  16. <version>3.5.0</version>
  17. </dependency>
  18. <!--logback日志包-->
  19. <dependency>
  20. <groupId>org.slf4j</groupId>
  21. <artifactId>slf4j-api</artifactId>
  22. <version>1.7.26</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>ch.qos.logback</groupId>
  26. <artifactId>logback-core</artifactId>
  27. <version>1.2.3</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>ch.qos.logback</groupId>
  31. <artifactId>logback-classic</artifactId>
  32. <version>1.2.3</version>
  33. </dependency>
  34. <!--mysql驱动-->
  35. <dependency>
  36. <groupId>mysql</groupId>
  37. <artifactId>mysql-connector-java</artifactId>
  38. <version>5.1.18</version>
  39. </dependency>
  40. </dependencies>
  41. <!--导入插件-->
  42. <!--配置maven的插件-->
  43. <build>
  44. <plugins>
  45. <!--配置的是jdk编译器-->
  46. <plugin>
  47. <groupId>org.apache.maven.plugins</groupId>
  48. <artifactId>maven-compiler-plugin</artifactId>
  49. <version>3.8.1</version>
  50. <configuration>
  51. <!-- 配置成自己的JDK版本 -->
  52. <source>1.8</source>
  53. <target>1.8</target>
  54. </configuration>
  55. </plugin>
  56. </plugins>
  57. </build>

3.导入配置文件

image.png
logback.xml
mybatis-config.xml
自己创建jdbc.properties文件

  1. jdbc.username=root
  2. jdbc.password=root
  3. jdbc.url=jdbc:mysql://localhost:3306/数据库名
  4. jdbc.driver=com.mysql.jdbc.Driver
  1. logback 日志等级提升到error
  2. mybatis-config配置文件自己根据需要自行配置

    4.创建层次包

    5.导入实体类

    6.导入工具类

    image.png image.png
  1. dao 用来存放持久层代码,mybatis接口放在这。
  2. pojo 存放实体类
  3. service 业务逻辑代码
  4. util 工具类
  5. web 界面显示层

    image.png

阅读参考附件项目代码,完成,并完善该项目相关功能。
附件:rbac-system-01.zip

导入后需要修改的两个地方:

  1. jdbc.properties 文件

image.png

  1. 项目的jdk。打开pom.xml来,找到build

image.png

数据库实战 - 图17

任务

  1. 把项目导入到idea中去,修改相关的配置。
  2. 把整体项目的功能逻辑理清楚。
  3. 根据自己的理解,参考项目实现该系统

参考以下步骤实现:
image.png