Sa-Token 是由 Dromara 开源社区孵化的一款**轻量级 Java 权限认证框架**,以“**简单、优雅、功能强**”为核心,专注解决登录认证、权限校验、会话管理、单点登录、OAuth2.0 及微服务网关鉴权等一系列权限问题。
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强制下线 注解式(推荐)
@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");
}
}
java SaSession session = StpUtil.getTokenSession(); session.set("key", "value"); Object val = session.get("key"); java SaSession session = StpUtil.getSessionByLoginId(1001); 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
@Configuration
public class SaTokenConfig {
@Bean
public SaGatewayFilter saGatewayFilter() {
return new SaGatewayFilter()
.setExcludeUrl("/user/login") // 放行登录
.setAuth(r -> {
// 全局校验登录
StpUtil.checkLogin();
});
}
}
@SaSsoServerSaSsoUtil.checkLogin()<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.44.0</version> <!-- 最新版 -->
</dependency>
sa-token:
token-name: Authorization
timeout: 2592000 # 30天
active-timeout: -1 # 不活跃永不过期
is-concurrent: true # 允许多端登录
is-read-cookie: true
is-read-header: true
@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());
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NotLoginException.class)
public SaResult handleNotLogin() {
return SaResult.error(401, "未登录,请先登录");
}
@ExceptionHandler(NotPermissionException.class)
public SaResult handleNotPermission() {
return SaResult.error(403, "无权限访问");
}
}
| 特性 | Sa-Token | Shiro | Spring Security |
|---|---|---|---|
| 上手难度 | 极低(一行代码) | 中 | 高(配置复杂) |
| 代码量 | 极少 | 较多 | 极多 |
| 功能覆盖 | 全(登录/权限/SSO/OAuth2) | 中 | 全(偏重安全) |
| 分布式支持 | 原生Redis/JWT | 需扩展 | 需扩展 |
| 微服务网关 | 原生支持 | 困难 | 较复杂 |
| 侵入性 | 极低 | 中 | 高 |
Sa-Token 以**极简API+全功能+高扩展**成为 Java 权限框架的优选,尤其适合追求开发效率、需要快速落地权限体系的现代项目。