Skip to content

fine-auth模块

  • 使用Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权 等一系列权限相关问题。

  • Sa-Token开发文档

依赖

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-Tokensa-token-redis-jackson依赖
  • 添加Sa-Tokensa-token-alone-redis依赖
  • 配置Sa-Tokenredis配置
  • 配置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

  • 用户信息存储
名称类型说明
用户IdHashMap
- userHashMap用户信息
- appsList<String>全局应用列表
- rolesList<String>全局角色
- permsList<String>全局权限
  • 用户应用列表
名称类型说明
app-nameHashMap用户有权限应用
- rolesList<HashMap>应用的角色详情
  • 用户全局角色列表
名称类型说明
- rolesList<Map>用户有权限全局角色
  • 角色权限(应用共享)
名称类型说明
perms:角色IdList<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

API调用

权限管理(fine-auth)