rbac-spring-boot-starter|Springboot角色/资源/权限控制组件
简介
rbac-spring-boot-starter基于RBAC (Resource-Based Access Control) 实现了用户资源权限的管理,支持Springboot自动装配。
项目github地址:rbac-spring-boot-starter
Demo项目
配置方法
加载maven依赖
1
2
3
4
5<dependency>
<groupId>io.github.flashvayne</groupId>
<artifactId>rbac-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>yml配置rbac.enable等配置:
1
2
3
4
5
6
7
8
9
10rbac:
enable: true #启动rbac-spring-boot-starter组件(默认false)
tokenExpireTime: 7200 #Token过期时间(默认7200s)
tokenName: authorization #request header中token的变量名(默认false)
redisKeyPrefix: 'rbac:' #token再redis中key的前缀(默认'rbac:')
spring:
redis: #配置Redis信息(本组件默认使用Redis作为Token存储的中间件)
host: 127.0.0.1
port: 6379
timeout: 5000执行本项目的schema中对应的SQL脚本建Rbac基础表:MySQL-rbac.sql(其他数据库请参照此sql实现)
将BaseRbacMapper加入Mybatis扫描:可参照Demo中RbacMapper.java和RbacMapper-MySQL.xml
可通过继承基础Mapper并加入Mybatis扫描。
如果是MySQL数据源可直接将resources/mapper/RbacMapper-MySQL.xml复制到你的mapper-locations路径。(其他数据库请参照RbacMapper-MySQL.xml实现)
使用方法
登录/Token生成:可参照Demo中DemoController
- 代码中注入AuthUserService,调用authUserService.authentication(userId,password)方法可校验用户名密码,
如检验通过,可通过authUserService.generateTokenInfo(userId)方法生成Token信息。实例代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
private AuthUserService authUserService;
public void testlogin(String userId,String password) {
if(authUserService.authentication(userId,password)){
log.info("用户名密码校验通过");
RbacTokenInfo rbacTokenInfo = authUserService.generateTokenInfo(userId);
log.info("token生成: {}",rbacTokenInfo);
}else{
log.error("用户名或密码错误");
}
}
鉴权:可参照Demo中DemoController
本组件基于Rbac用户-角色-资源三者进行权限管理。
鉴权切入点是@RbacAuthorization注解,在需要鉴权的方法上使用此注解。
此注解会检查token是否合法并将根据rbac_user_role、rbac_role_resource中配置的资源关系检查当前用户是否具有使用资源的权限(以请求的uri最为资源标识)。
如需要token解析后的用户信息,代码中可直接调用AuthUserUtils.get()获取当前用户信息。
1 |
|
如当前用户token不合法则返回Http 401 Unauthorized.
如token合法但不具有”/list”接口资源权限,则返回Http 403 Forbidden.
扩展性
开发者可通过重写关键组件并注入容器实现关键功能的自定义。可参照Demo中CustomizeRbacTokenService.java
- 可通过继承RbacAuthorizationAspect修改拦截器的实现。
- 可通过继承DefaultAuthUserServiceImpl或实现AuthUserService接口,来重写用户信息相关功能。
- 可通过继承DefaultTokenServiceImpl或实现TokenService接口,来重写Token服务相关功能。
Tips
- 本项目使用Redis作为Token保存的中间件,此举是为了直接分布式多台机器共享Token,如开发者不需要多机部署,可重写Token服务相关功能,重写方法见上方章节“扩展性”。
rbac数据库表定义(用户角色资源关系的配置)
用户表 rbac_user
字段名 | 字段说明 | 字段类型 | 默认值 | 是否为空 |
---|---|---|---|---|
id | id | int | null | 不为空 |
user_id | 用户code | varchar | null | 不为空 |
name | 用户名 | varchar | null | 是 |
password | 密码 | varchar | null | 是 |
status | 状态 0.正常 1.禁用 | tinyint | 0 | 不为空 |
mobile | 手机号 | varchar | null | 是 |
邮箱 | varchar | null | 是 | |
create_time | 创建时间 | datetime | CURRENT_TIMESTAMP | 是 |
update_time | 更新时间 | datetime | CURRENT_TIMESTAMP | 是 |
角色表 rbac_role
字段名 | 字段说明 | 字段类型 | 默认值 | 是否为空 |
---|---|---|---|---|
id | id | int | null | 不为空 |
name | 角色名 | varchar | null | 是 |
desc | 描述 | varchar | null | 是 |
create_time | 创建时间 | datetime | CURRENT_TIMESTAMP | 是 |
update_time | 更新时间 | datetime | CURRENT_TIMESTAMP | 是 |
资源表 rbac_resource
字段名 | 字段说明 | 字段类型 | 默认值 | 是否为空 |
---|---|---|---|---|
id | id | int | null | 不为空 |
type | 类型 1.接口 2.菜单 | tinyint | null | 不为空 |
name | 资源名称 | varchar | null | 是 |
url | 资源标识/地址 | varchar | null | 不为空 |
create_time | 创建时间 | datetime | CURRENT_TIMESTAMP | 是 |
update_time | 更新时间 | datetime | CURRENT_TIMESTAMP | 是 |
用户角色表 rbac_user_role
字段名 | 字段说明 | 字段类型 | 默认值 | 是否为空 |
---|---|---|---|---|
id | id | int | null | 不为空 |
user_id | 用户id | int | null | 不为空 |
role_id | 角色id | int | null | 不为空 |
create_time | 创建时间 | datetime | CURRENT_TIMESTAMP | 是 |
update_time | 更新时间 | datetime | CURRENT_TIMESTAMP | 是 |
角色资源表 rbac_role_resource
字段名 | 字段说明 | 字段类型 | 默认值 | 是否为空 |
---|---|---|---|---|
id | id | int | null | 不为空 |
role_id | 角色id | int | null | 不为空 |
resource_id | 资源id | int | null | 不为空 |
create_time | 创建时间 | datetime | CURRENT_TIMESTAMP | 是 |
update_time | 更新时间 | datetime | CURRENT_TIMESTAMP | 是 |