一、Sa-Token介绍
1. Sa-Token简介
Sa-Token是一款轻量级Java权限认证框架,旨在解决Web系统中常见的登录认证、权限验证、Session会话、单点登录等问题。其核心目标是以最简洁的方式,实现强大的权限控制功能,帮助开发者快速完成权限系统的搭建。
Sa-Token具有如下优势:
优势 描述
简单易用 API设计简洁明了,易于集成和使用,上手快,学习成本低。
功能丰富 支持多种权限控制需求,满足复杂业务场景。支持登录认证、权限验证、角色验证、Session会话、多账号体系等功能。
高性能 轻量级设计,对系统性能影响小。
高度可扩展 提供丰富的扩展接口,与Spring、Spring Boot等常用框架高度兼容,支持自定义持久化、注解方式验证、单点登录等高级特性。
社区活跃 有良好的社区支持和文档资源。
2. Sa-Token原理解析
Sa-Token的核心原理是通过Token机制实现用户的身份认证和权限校验。
其主要工作流程如下:
① 登录认证:用户登录成功后,服务器生成一个全局唯一的Token,并将其返回给客户端。
② Token存储:Token与用户身份信息的映射关系保存在服务器的会话中(如Redis、内存等)。
③ 权限验证:客户端请求时携带Token,服务器根据Token获取用户信息,验证其权限是否满足要求。
④ 会话管理:支持Session会话管理,可以获取和操作当前会话的属性。
流程图例如下:
3. Sa-Token与其他权限框架比较
Sa-Token与其他常见权限框架在学习成本、集成难度上有显著优势:
特性 Sa-Token Shiro Spring Security
学习成本 低 中 高
功能丰富度 高 中 高
集成难度 低 中 高
性能表现 高 中 中
社区支持 活跃 一般 活跃
扩展性 高 中 高
二、Sa-Token的基本语法
在实际项目中,Sa-Token通过简单的配置和API调用,即可实现完整的权限管理功能。以下将通过一个完整的Spring Boot示例,演示如何集成和使用Sa-Token。
1. 创建Spring Boot项目
首先,创建一个新的Spring Boot项目,可以使用IDEA的项目向导或Spring Initializr。
引入必要的依赖:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Sa-Token核心依赖 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
</dependencies>
2. 配置Sa-Token
application.yml
# Sa-Token配置,可根据需要进行调整
sa-token:
# token有效期,单位秒,默认30天
timeout: 2592000
# 是否打开二级登录校验
open-safe: false
3. 配置拦截器
创建配置类,添加Sa-Token的拦截器,以拦截请求并进行权限验证。
SaTokenConfigure.java
import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册Sa-Token的注解拦截器,拦截所有路径
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
}
}
4. 登录认证
创建登录接口,实现用户登录功能。
LoginController.java
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;
@RestController
public class LoginController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 1. 校验用户名和密码(这里模拟一个简单的校验)
if("admin".equals(username) && "123456".equals(password)) {
// 2. 登录,保存用户ID为10001
StpUtil.login(10001);
return "登录成功,Token:" + StpUtil.getTokenValue();
}
return "用户名或密码错误";
}
}
说明:
调用StpUtil.login(10001)方法,实现登录操作,参数为用户的唯一标识ID。
登录成功后,可以通过StpUtil.getTokenValue()获取当前会话的Token。
5. 权限验证
创建需要权限验证的接口,例如获取用户信息的接口。
UserController.java
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
// 查询用户信息,需登录
@GetMapping("/info")
public String getUserInfo() {
// 校验是否登录
StpUtil.checkLogin();
// 获取用户ID
int userId = StpUtil.getLoginIdAsInt();
return "当前用户信息,ID:" + userId;
}
// 修改用户信息,需有权限"user:update"
@SaCheckPermission("user:update")
@PostMapping("/update")
public String updateUser() {
return "用户信息更新成功";
}
}
说明:
使用StpUtil.checkLogin()方法手动校验登录状态。
使用@SaCheckPermission("user:update")注解,声明该接口需要权限user:update。