Sa-Token:轻量级 Java 权限认证框架

2025-07-18 08:30:10

在现代 Web 应用开发中,权限控制是不可或缺的一部分。无论是用户登录状态的维护、角色权限的划分,还是接口访问的安全性保障,都离不开一个稳定高效的权限认证框架。Sa-Token 是一款专为 Java 开发者设计的轻量级权限认证中间件,它以简洁的 API 和强大的功能迅速赢得了广泛的关注。本文将深入解析 Sa-Token 的基本原理、安装方式以及典型应用场景,帮助开发者快速掌握其使用方法。

Sa-Token Logo

Sa-Token 简介

Sa-Token 是一个基于 Token 的 Java 权限认证框架,支持 Spring Boot、Spring MVC、Servlet、Blade、JFinal 等主流 Java Web 框架。它通过统一的接口抽象和灵活的扩展机制,实现了包括登录认证、权限验证、Token 续签、多端登录、踢人下线等在内的多种功能。Sa-Token 的设计目标是“简单易用、功能全面、性能高效”,适用于中小型项目到大型分布式系统的各种场景。

相较于传统的 Session 机制,Sa-Token 采用 Token 模式进行身份识别,避免了服务器资源的占用,并天然支持跨域和分布式部署。此外,它还提供了丰富的插件生态,如集成 Redis 缓存、日志记录、加密算法等,极大提升了开发效率和系统安全性。

安装与配置

引入依赖

Sa-Token 支持多种构建工具,最常见的是通过 Maven 或 Gradle 进行依赖管理。

使用 Maven 引入:

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.35.0</version>
</dependency>

使用 Gradle 引入:

implementation 'cn.dev33:sa-token-spring-boot-starter:1.35.0'

引入依赖后,Spring Boot 会自动完成 Sa-Token 的基础配置,无需额外操作即可开始使用。

配置文件设置

虽然 Sa-Token 提供了默认配置,但在实际项目中通常需要根据业务需求进行定制化配置。你可以在 application.ymlapplication.properties 中修改相关参数。

以下是一个典型的 application.yml 配置示例:

sa:
  token:
    name: satoken
    timeout: 86400
    activity-timeout: -1
    is-concurrent: true
    is-share: true
    is-read-cookie: true
    is-read-header: false
    is-log: true

上述配置定义了 Token 名称、有效期(单位为秒)、是否允许并发登录、是否启用 Cookie 读取等功能。开发者可以根据具体需求调整这些参数。

核心功能详解

登录认证

Sa-Token 的登录认证流程非常简洁,主要通过调用 StpUtil.login() 方法完成用户登录操作。该方法接受用户 ID 作为参数,并自动生成 Token 返回给客户端。

import cn.dev33.satoken.stp.StpUtil;

// 用户登录
StpUtil.login(10001);

// 获取当前 Token
String token = StpUtil.getTokenValue();

登录成功后,Sa-Token 会将 Token 存储在本地缓存或 Redis 中,并绑定用户信息。此后,所有携带该 Token 的请求都将被视为已认证用户发起的操作。

权限验证

权限验证是 Sa-Token 的核心能力之一。你可以通过 StpUtil.hasPermission() 方法判断当前用户是否具备某个权限。

if (StpUtil.hasPermission("user.add")) {
    // 具有 user.add 权限,执行添加操作
} else {
    // 无权限,抛出异常或返回错误码
}

除了静态权限校验外,Sa-Token 还支持动态权限加载,开发者可以通过实现 SFunction 接口来自定义权限逻辑。

角色验证

除了权限级别,Sa-Token 同样支持基于角色的访问控制(RBAC)。你可以通过 StpUtil.hasRole() 方法检查当前用户是否属于指定角色。

if (StpUtil.hasRole("admin")) {
    // 当前用户是管理员角色
}

这一特性使得 Sa-Token 可以轻松对接企业级权限管理系统,满足不同组织架构下的权限管理需求。

多端登录与 Token 续签

Sa-Token 支持多设备登录,开发者可以为不同的登录设备分配独立的 Token,并分别管理其生命周期。同时,框架也提供了 Token 自动续签功能,确保用户在有效期内无需重复登录。

// 设置 Token 续签时间
StpUtil.updateLastActivityToNow();

// 判断 Token 是否过期
boolean isExpire = StpUtil.isTokenExpired();

通过上述方法,可以实现 Token 的自动刷新和失效检测,提升用户体验的同时保证系统安全。

踢人下线

在某些特殊场景下,例如用户主动退出、管理员强制登出等,Sa-Token 提供了“踢人下线”的功能。开发者可以通过如下方式强制终止用户的会话:

// 强制用户下线
StpUtil.kickout(10001);

该操作会清除用户的所有 Token,并使其无法继续访问受保护资源,适用于敏感操作后的安全保障。

使用技巧与注意事项

获取当前登录用户

在大多数业务逻辑中,获取当前登录用户是最常见的需求。Sa-Token 提供了便捷的方法来获取用户 ID:

Long userId = StpUtil.getLoginIdAsLong();

你也可以将其封装为工具类,在整个项目中复用。

Token 的传递方式

Sa-Token 默认通过 Cookie 传递 Token,但同时也支持 Header、URL 参数等方式。开发者可以通过配置文件启用或禁用特定的传递方式。

sa:
  token:
    is-read-cookie: true
    is-read-header: true

启用 Header 读取后,客户端可通过在请求头中添加 satoken=xxx 来传递 Token,适用于前后端分离架构。

登出操作

用户登出时只需调用 StpUtil.logout() 即可清除当前会话:

StpUtil.logout();

该方法会移除当前 Token,并释放相关资源,确保用户下次访问时必须重新登录。

Token 加密与签名

为了增强 Token 的安全性,Sa-Token 支持对 Token 进行签名和加密。开发者可以通过配置密钥来提升 Token 的防篡改能力:

sa:
  token:
    secret-key: your-secret-key

启用密钥后,生成的 Token 将包含数字签名,防止被非法伪造。

日志与调试

在开发阶段,建议开启 Sa-Token 的日志功能,以便跟踪 Token 的生成、验证和销毁过程:

sa:
  token:
    is-log: true

开启日志后,可以在控制台查看详细的认证流程信息,有助于排查问题和优化逻辑。

总结

Sa-Token 以其轻量、灵活和功能齐全的特点,成为 Java 开发者在权限认证领域的重要选择。它不仅简化了登录认证和权限控制的实现流程,还提供了诸如 Token 续签、多端登录、踢人下线等高级功能,能够满足从单体应用到微服务架构的各种场景需求。

dromara
Sa-Token 是一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!拥有五大核心模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。
Java
Apache-2.0
17.9 k