第二十四节 Sa-Token权限认证框架简介

亮子 | 2026-04-08 10:52:31 | 37 | 0 | 0 | 0

Sa-Token 是由 Dromara 开源社区孵化的一款**轻量级 Java 权限认证框架**,以“**简单、优雅、功能强**”为核心,专注解决登录认证、权限校验、会话管理、单点登录、OAuth2.0 及微服务网关鉴权等一系列权限问题。

一、核心优势

  • 极简API:一行代码完成登录、鉴权、踢人等操作,零配置可启动。
  • 功能全面:覆盖登录、权限、会话、SSO、OAuth2.0、微服务网关等。
  • 高扩展性:支持 Redis/JWT 持久化、自定义权限验证逻辑。
  • 生态丰富:无缝适配 SpringBoot、WebFlux、Solon、Gateway 等。
  • 轻量无侵入:核心包仅几百 KB,不污染业务代码。

二、核心功能

1. 登录认证(最常用)

  • 会话登录
    java StpUtil.login(1001); // 账号ID=1001登录
  • 校验登录
    java StpUtil.checkLogin(); // 未登录抛异常
  • 获取当前用户
    java Object loginId = StpUtil.getLoginId(); // 账号ID String token = StpUtil.getTokenValue(); // 当前Token
  • 登出
    java StpUtil.logout();
  • 踢人下线
    java StpUtil.kickout(1001); // 账号ID=1001强制下线

2. 权限与角色认证(注解/代码)

注解式(推荐)

@RestController
@RequestMapping("/user")
public class UserController {
    // 必须登录
    @SaCheckLogin
    @GetMapping("/info")
    public String info() {
        return "用户信息:" + StpUtil.getLoginId();
    }

    // 必须有 admin 角色
    @SaCheckRole("admin")
    @GetMapping("/admin")
    public String admin() {
        return "管理员面板";
    }

    // 必须有 user:delete 权限
    @SaCheckPermission("user:delete")
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        return "删除用户:" + id;
    }
}

代码式

// 校验角色
StpUtil.checkRole("admin");
// 校验权限
StpUtil.checkPermission("user:add");

自定义权限数据源(从DB/Redis读权限)

@Component
public class StpInterfaceImpl implements StpInterface {
    // 返回账号拥有的权限
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 从DB查:loginId 对应的权限
        return Arrays.asList("user:add", "user:delete");
    }
    // 返回账号拥有的角色
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        return Arrays.asList("admin", "user");
    }
}

3. Session 会话

  • Token-Session(当前Token专属)
    java SaSession session = StpUtil.getTokenSession(); session.set("key", "value"); Object val = session.get("key");
  • Account-Session(账号全端共享)
    java SaSession session = StpUtil.getSessionByLoginId(1001);

4. 分布式与 Redis 集成

pom.xml

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis</artifactId>
    <version>最新版</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml

sa-token:
  token-name: satoken       # 请求头Token名
  timeout: 1800            # Token有效期(秒)
  is-concurrent: true      # 允许多端登录
  is-share: true           # Cookie共享
  token-style: uuid        # Token风格
  is-log: true             # 打印日志
spring:
  redis:
    host: 127.0.0.1
    port: 6379

5. 微服务网关鉴权(Gateway示例)

@Configuration
public class SaTokenConfig {
    @Bean
    public SaGatewayFilter saGatewayFilter() {
        return new SaGatewayFilter()
            .setExcludeUrl("/user/login") // 放行登录
            .setAuth(r -> {
                // 全局校验登录
                StpUtil.checkLogin();
            });
    }
}

6. 单点登录(SSO)

  • 支持同域/跨域/不共享Redis三种模式。
  • 服务端:@SaSsoServer
  • 客户端:SaSsoUtil.checkLogin()

7. OAuth2.0

  • 支持授权码、简化、密码、客户端凭证四种模式。
  • 内置授权服务、资源服务、接口。

三、SpringBoot 快速集成

1. 引入依赖

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.44.0</version> <!-- 最新版 -->
</dependency>

2. 配置(可选)

sa-token:
  token-name: Authorization
  timeout: 2592000     # 30天
  active-timeout: -1   # 不活跃永不过期
  is-concurrent: true  # 允许多端登录
  is-read-cookie: true
  is-read-header: true

3. 登录接口

@PostMapping("/login")
public SaResult login(String username, String password) {
    // 1. 校验用户名密码(DB)
    if (!"admin".equals(username) || !"123456".equals(password)) {
        return SaResult.error("账号或密码错误");
    }
    // 2. 登录
    StpUtil.login(1001);
    // 3. 返回Token
    return SaResult.ok("登录成功").setData(StpUtil.getTokenInfo());
}

4. 全局异常处理

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(NotLoginException.class)
    public SaResult handleNotLogin() {
        return SaResult.error(401, "未登录,请先登录");
    }
    @ExceptionHandler(NotPermissionException.class)
    public SaResult handleNotPermission() {
        return SaResult.error(403, "无权限访问");
    }
}

四、与 Shiro/Spring Security 对比

特性 Sa-Token Shiro Spring Security
上手难度 极低(一行代码) 高(配置复杂)
代码量 极少 较多 极多
功能覆盖 全(登录/权限/SSO/OAuth2) 全(偏重安全)
分布式支持 原生Redis/JWT 需扩展 需扩展
微服务网关 原生支持 困难 较复杂
侵入性 极低

五、适用场景

  • 中小型项目快速鉴权
  • 前后端分离、移动端
  • 分布式/微服务统一鉴权
  • 单点登录、OAuth2.0 系统
  • 需要会话强控制(踢人、封禁)

六、总结

Sa-Token 以**极简API+全功能+高扩展**成为 Java 权限框架的优选,尤其适合追求开发效率、需要快速落地权限体系的现代项目。