前言
在微服务和前后端分离的开发趋势下,高效的权限管理是保障系统安全的关键。Sa-Token 作为一款轻量级 Java 权限认证框架,以其简洁易用、功能强大的特点,在 Spring Boot 项目中得到广泛应用。本文将深入剖析 Sa-Token 的原理,详解多种实现方式、框架优劣点、不同 Spring Boot 版本的适配差异,以及分布式场景下的解决方案,并提供详细代码示例,助力开发者快速掌握这一技术。
一、Sa-Token 原理深度剖析
1.1 核心架构与设计理念
Sa-Token 基于 “插件式” 设计理念,通过模块化架构实现权限管理的各个功能。其核心围绕 “Token 认证” 展开,将用户身份信息、权限信息等封装在 Token 中,通过 Token 的验证和解析实现用户身份识别与权限控制。框架内部采用责任链模式处理请求,支持灵活的插件扩展,开发者可根据需求自定义认证逻辑、权限校验规则等。
1.2 Token 生命周期管理
- 生成:当用户登录成功,Sa-Token 通过StpUtil.login(Object id)方法生成 Token,并将用户 ID、过期时间等信息存储在 Token 中。Token 的生成支持多种方式,如随机字符串、JWT 格式等。
- 存储:默认情况下,Token 存储在服务器内存中,也可通过配置将其存储到 Redis、数据库等外部存储介质,以适应分布式场景。
- 验证:客户端携带 Token 发起请求,服务器通过StpUtil.isLogin()方法验证 Token 的有效性,若 Token 有效,则解析出用户信息进行后续操作。
- 刷新与注销:Token 可通过StpUtil.renewTimeout()方法刷新过期时间,用户登出时调用StpUtil.logout()方法注销 Token,使其失效。
1.3 权限校验机制
Sa-Token 提供多种权限校验方式,包括角色校验、权限码校验、临时授权等。通过@SaCheckRole、@SaCheckPermission
等注解,或StpUtil.hasRole(String role)、StpUtil.hasPermission(String permission)
等代码方法,实现对资源访问的权限控制。权限校验逻辑可通过自定义拦截器、过滤器等方式进行扩展。
–
二、Spring Boot 整合 Sa-Token 多种实现方式
2.1 基础整合与登录认证
2.1.1 项目搭建与依赖添加
创建 Spring Boot 项目,在pom.xml文件中添加 Sa-Token 依赖:
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
2.1.2 配置文件设置
在application.yml
文件中进行基础配置:
sa-token:
# token名称 (同时也是cookie名称)
token-name: satoken
# token有效期,单位s 默认30天, -1代表永久有效
timeout: 2592000
# 是否允许同一账号并发登录 (为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为false时每次登录新建一个token)
is-share: false
2.1.3 登录接口实现
编写用户登录接口,验证用户信息并生成 Token:
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 模拟用户验证,实际应用中需从数据库查询
if ("admin".equals(username) && "123456".equals(password)) {
StpUtil.login(username);
return "登录成功,Token: