该项目是基于 Springboot + Shiro + JWT令牌 实现的SSO系统。
系统使用 Shiro进行用户认证与授权管理,JWT令牌作为用户登录凭证,使用Redis作为Shiro管理的session以及JWT 的RefreshToken的存储介质,
实现了用户单点登录认证(主要功能)与授权的基本功能。
技术栈:
SpringBoot + Shiro + JWT + Mysql + Redis + LayUi(及LayUi第三方插件) + FreeMarker等
功能简介
1.用户登录认证、授权、Session管理、JWT凭证的生成、认证和刷新
2.组织结构管理、职位管理、用户管理、组织分配。
3.角色管理:
3.1 角色基本信息管理。
3.2 角色分层、角色互斥、角色权限继承、角色分配、权限分配等功能。
4.权限管理。
SSO单点登录逻辑参考:
app-1&app-2: ShiroConfig、JwtAuthenticatingFilter、JwtToken、LoginController、RedisCacheManager、RedisCache、RedisCacheSessionDAO、JedisConfig、pass.ftl
sso-server: ShiroConfig、JwtAuthenticatingFilter、SsoServerController、RedisCacheManager、RedisCache、RedisCacheSessionDAO、JedisConfig、pass.ftl
组织架构、职位、用户、角色、权限管理功能概述
a. 组织节点之间有上下级关系,如总公司、分公司、总公司部门、分公司部门等(也可以是你认为合理的任何组织架构);
b. 你可以添加任何节点的同级节点与子节点(右击弹窗操作),其中“超级管理员节点”不可删除,主要为了维护超级管理员与组织结构之间的关系。
c. 任何组织架构节点可直接新增职位,职位也可以有上下级关系。
d. 新增用户时,必须先选择职位,否则不允许操作(后续如果新增了其他类型的分组再进行逻辑修改)。
e. 角色、权限各自的CURD操作。
f. <用户-组织>、<用户-职位>、<用户-角色>、<用户-权限>关系处理逻辑:
g. 最后通过shiro标签或注解进行资源访问权限控制。
1. 登录模块
1.1 用户在任何子系统进行登录/未认证被拦截时,都会跳转到SSO系统的登录页面;
1.2 用户访问app1任何存在的url(除了/logout),如果app2已经成功登录,那么用户会直接跳转到app1的 index 页面;
1.3 账号登录失败次数限制:
a. 用户连续登录失败次数小于5期间,如果有一次登录成功,那么该用户登录失败次数、限制登录时长将清零;
b. 用户连续5次登录失败时,提示"15分钟后再进行登录操作",并开始记录限制登录时长15分钟;
c. 用户连续10次登录失败时,提示"45分钟后再进行登录操作",此时限制登录时长更新为45分钟;
d. 用户连续15次登录失败时,提示"连续 15 次登录失败,再次尝试会被限制登录!",限制登录时长为45分钟;
e. 用户第16次登录失败时,提示"连续 16 次登录失败,该账号已被限制登录,请联系管理员!",登录被拦截,后端对该用户的账号信息查询被终止;
f. 在限制登录时段内,即使用户输入了正确的用户名、密码,依旧限制用户登录操作;过了限制登录时段,用户登录失败次数、限制登录时长自动清零,用户可以再次进行登录操作;
g. 用户登录失败次数小于15次时,如果用户有一次登录成功了,那么系统会清除该用户登录失败信息记录;
h. 管理员可以从后台页面手动解除用户的登录限制;
i. 用户登录成功,系统自动完成用户授权,进行资源访问控制。
2. 仪表盘
board.ftl 加入echarts图表及layui表格的静态页面,未做更进一步的功能开发。
3. 用户管理
3.1 包含组织架构、职位、用户的CURD、分配组织、重置密码等功能,实现对相关信息有组织的管理。
a.删除组织节点的时候,与其关联的节点的资源必须先得到释放。
例如,公司节点有部门节点(关联着职位),则要先删除部门节点(删除职位),部门节点关联着职位,则必须先删除职位;如果职位还分配着用户,则要先删除用户。删除组织结构节点、职位节点时,相应的<组织-角色>、<职位-角色>、<角色-权限>的映射关系会自动解除。
b. 用户信息管理:包含新增用户、查看及修改用户基本信息,为用户分配组织(主要是为了通过组织批量分配角色,达到批量分配权限的目的)。
c. 新增组织、职位、用户的时候,系统自动为其分配基础角色,从而达到分配基础权限的目的。
d. 用户状态为“禁用”时,用户不可登录系统。
e. 个人基本信息设置与密码修改。
4. 角色管理
该模块包含角色基本信息的CURD、角色成员列表、角色权限分配、角色组织(职位)分配、角色互斥管理。
a. 角色有上下级关系,上级角色继承其子孙角色的所有权限,子孙角色不可越权。例如,为会计助理分配权限的时候,只能选择会计已有的权限(通过后台数据及前端代码控制复选框是否可选)。
b. 将角色分配给组织、职位,从而间接达到为用户分配权限的目的。
c. 互斥角色管理:例如,会计和财务审核员不能同时分配给给某一个员工,这也意味着将角色分配给组织和职位的时候,系统会自动检查已勾选的组织、职位已分配的角色与待分配的角色之间是否存在互斥关系,如果存在,则不允许此次角色分配,需要按提示进行相应角色关系处理。
5. 权限管理
权限基本信息的CURD,删除权限时会自动解除<角色-权限>映射关系。
- JDK 1.8+
- Tomcat-8.5.63
- SpringBoot2.7.9
- Mybatis-3.5.9
- shiro-core 1.10.1
- Redis
- Mysql 5.7.33
- Layui 2.7.6
- Maven
- JWT
项目安装、运行步骤
- 在本地准备好Java 8运行环境以及Tomcat。
- 安装Mysql数据库,并新建ucan_admin数据库,运行项目中的ucan_admin.sql文件。
- 将项目导入你自己的开发工具 eclipse中。
- 分别修改app-1、app-2、sso-server 的 src/main/resources 目录下的application-dev.yml 文件中的用户名、密码、端口号为你所使用的数据库连接信息。
- 在相应的主机上进行DNS域名解析配置,如:app-1、app-2、sso-server直接在当前windows系统上运行,那么就去 C:\Windows\System32\drivers\etc目录下的hosts文件新增以下内容:
127.0.0.1 localhost
127.0.0.1 ucan.com
127.0.0.1 www.ucan.com
127.0.0.1 login.ucan.com
127.0.0.1 umall.com
127.0.0.1 www.umall.com
然后 cmd 窗口执行:ipconfig /flushdns
(linux系统,修改 /etc/hosts文件)
- 安装 Redis。
- 分别在app-1、app-2、sso-server 的 src/main/resources 目录下的application.yml 配置 Redis服务地址/域名、端口号,以及app-1、app-2的SSO系统的相关调用服务地址配置。
- sso-server、app-1、app-2 项目,其端口号分别为:80/8080/8082。(你也可以将app-1/app-2/sso系统分别放在不同的主机上运行,直接使用80端口)
说明:如果sso-server、app-1、app-2 在同一台主机上运行,则可以跳过步骤7 ,否则请根据你的实际情况进行mysql、redis、DNS的配置。
项目运行测试
确认配置信息无误后,分别启动 app-1、app-2、sso系统 ,然后在同一浏览器中输入以下地址:
http://ucan.com:8080/toLogin
http://ucan.com:8080/index
http://umall.com:8082/toLogin
http://umall.com:8082/index
以测试各种不同登录状态下运行效果。
用户名:admin 密码:123456
用户名:小王 密码:123456
**注:**上图只展示了主要的关联字段,详细表字段,请查看src\main\resources\static\database目录的ucan_admin.sql文件
表名称说明:
users: 用户表
organization: 组织表(有上下级关系)
post: 职位表(有上下级关系)
roles: 角色表(有上下级关系)
permissions: 权限表(有上下级关系)
user_organization: <用户-组织>关系表
user_post: <用户-职位>关系表
role_organization: <角色-组织>关系表
role_post: <角色-职位>关系表
role_permission: <角色-权限>关系表
mutex_roles: 互斥角色表
**注:**所有数据表仅在代码逻辑上做了外键约束,数据表结构未添加外键约束,可自行在数据表添加外键约束(如需要)。
RBAC业务逻辑参考:
https://www.cnblogs.com/iceblow/p/11121362.html
https://juejin.cn/post/7121977695197970463
RBAC权限管理系统的具体业务跟具体需求有关,欢迎大家的指正与交流。
其他项目请移步: