fine-auth模块
使用
Sa-Token是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权 等一系列权限相关问题。
依赖
xml
<!--fine-auth-->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-auth</artifactId>
<version>${fine.version}</version>
</dependency>配置
- src/main/resources/application.yml
yaml
spring:
profiles:
include: auth
application:
name: fine-example # 必须和fpk应用名称相同
data:
redis:
port: 6379
host: 127.0.0.1
password:
database: 0
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
# springdoc-openapi项目配置
springdoc:
group-configs:
- group: '权限管理'
paths-to-match: '/**'
packages-to-scan: cn.finemap.auth角色定义
- src/main/resources/role.json
- 只能定义一层角色,一层所属权限
- 编码不建议重复,参考sa-token中的
@SaCheckRole():角色校验
json
[
{
"name": "管理员",
"code": "admin",
"children": [
"admin","*"
]
},
{
"name": "测试人员",
"code": "test",
"children": [
{
"name": "测试模块",
"code": "fmDataTest",
"children": [
{
"name": "添加接口",
"code": "fmDataUser.add"
},
{
"name": "获取接口",
"code": "fmDataUser.get"
}
]
}
]
}
]权限定义
- src/main/resources/perm.json
- 只能定义两层:
模块名称、权限名称 - 编码不建议重复,参考sa-token中的
@SaCheckPermission():权限校验
json
[
{
"name": "管理员权限",
"code": "admin",
"children": [
{
"name": "管理员权限",
"code": "*"
}
]
},
{
"name": "测试模块",
"code": "fmDataTest",
"children": [
{
"name": "添加接口",
"code": "fmDataUser.add"
},
{
"name": "获取接口",
"code": "fmDataUser.get"
}
]
}
]Sa-Token使用
java
// 会话登录:参数填写要登录的账号id,建议的数据类型:long | int | String, 不可以传入复杂类型,如:User、Admin 等等
StpUtil.login(Object id);
// 将用户信息存储到Session中
StpUtil.getSession().set("userInfo",user);
// 当前会话注销登录
StpUtil.logout();
// 获取当前会话是否已经登录,返回true=已登录,false=未登录
StpUtil.isLogin();
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin();java
/**
* 自定义权限加载接口实现类
*/
@Component // 保证此类被 SpringBoot 扫描,完成 Sa-Token 的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {
/**
* 返回一个账号所拥有的权限码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
// 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user.add");
list.add("user.update");
list.add("user.get");
// list.add("user.delete");
list.add("art.*");
return list;
}
/**
* 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
// 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;
}
}创建子模块:fine-auth
- 在fine-parent中创建:fine-auth子模块
fine-auth
- 创建子模块:New > Module...
- 添加
Sa-Token的依赖 - 添加
Sa-Token的sa-token-redis-jackson依赖 - 添加
Sa-Token的sa-token-alone-redis依赖 - 配置
Sa-Token的redis配置 - 配置Sa-Token
- 启用注解鉴权
- 添加:接口权限管理
依赖
添加依赖(包含Sa-Token依赖)
- fine-auth/pom.xml
xml
<!-- Sa-Token -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${satoken.version}</version>
</dependency>
<!-- Sa-Token 整合 Redis-->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>${satoken.version}</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- Sa-Token插件:权限缓存与业务缓存分离 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-alone-redis</artifactId>
<version>${satoken.version}</version>
</dependency>
<!-- 框架工具类 -->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-commons</artifactId>
<version>${fine.version}</version>
<optional>true</optional>
</dependency>
<!-- fine-doc -->
<dependency>
<groupId>cn.finemap</groupId>
<artifactId>fine-doc</artifactId>
<version>${fine.version}</version>
<optional>true</optional>
</dependency>配置yaml
Sa-Token配置
- src/main/resources/application-auth.yml
yaml
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# 应用名称(用于权限过滤)
app-name: ${spring.application.name}
# token 名称(同时也是 cookie 名称)
token-name: finetoken
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
is-share: true
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: uuid
# 是否输出操作日志
is-log: false
# 是否从cookie中读取token
is-read-cookie: true
# 是否从head中读取token
is-read-head: true
# 打印版本字符画
is-print: false
# 权限缓存与业务缓存分离
alone-redis:
database: 1
host: ${spring.data.redis.host}
# Redis服务器连接密码(默认为空)
password: ${spring.data.redis.password}
port: ${spring.data.redis.port}
timeout: ${spring.data.redis.timeout}权限配置类
Sa-Token配置类
- 权限认证接口实现类:
StpInterfaceImpl.java - 开启注解鉴权:
SaTokenConfigure.java - 异常拦截:
SaTokenExceptionHandler.java
权限配置类
- 权限控制类:
AuthController.java - 权限服务:
AuthService.java - 权限工具类:
StpLoginUserUtil.java
权限存储说明
权限存储
权限工具类:
StpLoginUserUtil.java
- 用户信息存储
| 名称 | 类型 | 说明 |
|---|---|---|
用户Id | HashMap | |
| - user | HashMap | 用户信息 |
| - apps | List<String> | 全局应用列表 |
| - roles | List<String> | 全局角色 |
| - perms | List<String> | 全局权限 |
- 用户应用列表
| 名称 | 类型 | 说明 |
|---|---|---|
app-name | HashMap | 用户有权限应用 |
| - roles | List<HashMap> | 应用的角色详情 |
- 用户全局角色列表
| 名称 | 类型 | 说明 |
|---|---|---|
| - roles | List<Map> | 用户有权限全局角色 |
- 角色权限(应用共享)
| 名称 | 类型 | 说明 |
|---|---|---|
perms:角色Id | List<Map> | 角色对应权限 |
维护父工程:fine-parent
fine-parent
- 添加该子模块
- 在父工程中,管理版本参数
pom
- fine-parent/pom.xml
xml
<!-- 版本参数 -->
<properties>
<!-- fine-auth -->
<satoken.version>1.38.0</satoken.version>
</properties>fine-auth使用
权限注解
接口注解
- 权限校验
java
@SaCheckPermission("tableName:get")
public Result<String> getTableName(){
return new Result(data);
}
// 双重校验
@SaCheckPermission(value = "tableName:find", orRole = "admin")
public Result<String> findTableName(){
return new Result(data);
}- 角色校验
java
@SaCheckRole("admin")
public Result<String> getTableName(){
return new Result(data);
}- 登录校验
java
@SaCheckLogin
public Result<String> getTableName(){
return new Result(data);
}权限管理
工具类获取登录信息
java
// 获取登录用户数据(全局)
Map userInfo = StpLoginUserUtil.getUserInfo();
// 获取登录用户角色列表(当前应用)
List<String> roles = StpLoginUserUtil.getRoles();
// 获取登录用户权限列表(当前应用)
List<String> perms = StpLoginUserUtil.getPerms();
// 获取登录用户当前应用信息(无权限返回空)
Map appInfo = StpLoginUserUtil.getAppInfo();服务类获取登录信息
java
// 服务类
@Autowired
private AuthService authService;
// 获取登录用户数据(全局)
Result userInfoResult = authService.isLogin();
// 获取登录用户角色列表(当前应用)
Result<List<String>> rolesResult = authService.getRoles();
// 获取登录用户权限列表(当前应用)
Result<List<String>> permsResult = authService.getPerms();
// 获取登录用户当前应用信息(无权限返回错误)
Result<Map> appInfoResult = authService.getApp();接口获取登录信息
- 获取登录用户数据(全局) :
/appName/isLogin - 获取登录用户角色列表(当前应用) :
/appName/getRoles - 获取登录用户权限列表(当前应用) :
/appName/getPerms - 获取登录用户当前应用信息(无权限返回错误) :
/appName/getApp