简介

rbac-spring-boot-starter基于RBAC (Resource-Based Access Control) 实现了用户资源权限的管理,支持Springboot自动装配。
项目github地址:rbac-spring-boot-starter

Demo项目

Rbac-Demo

配置方法

  1. 加载maven依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>io.github.flashvayne</groupId>
    <artifactId>rbac-spring-boot-starter</artifactId>
    <version>2.0.0</version>
    </dependency>
  2. yml配置rbac.enable等配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    rbac:
    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
  3. 执行本项目的schema中对应的SQL脚本建Rbac基础表:MySQL-rbac.sql(其他数据库请参照此sql实现)

  4. 将BaseRbacMapper加入Mybatis扫描:可参照Demo中RbacMapper.javaRbacMapper-MySQL.xml
    可通过继承基础Mapper并加入Mybatis扫描。
    如果是MySQL数据源可直接将resources/mapper/RbacMapper-MySQL.xml复制到你的mapper-locations路径。(其他数据库请参照RbacMapper-MySQL.xml实现)

使用方法

登录/Token生成:可参照Demo中DemoController

  1. 代码中注入AuthUserService,调用authUserService.authentication(userId,password)方法可校验用户名密码,
    如检验通过,可通过authUserService.generateTokenInfo(userId)方法生成Token信息。实例代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Autowired
    private AuthUserService authUserService;

    @PostMapping("/login")
    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
2
3
4
5
6
7
8
@RbacAuthorization
@GetMapping("/list")
public void list(@RequestParam Integer pageNum,@RequestParam Integer pageSize,
String param1,String param2){
log.info("当前用户:{}",AuthUserUtils.get());
Page.start(pageNum,pageSize);
log.info(testService.list(param1,param2));
}

如当前用户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
email 邮箱 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