微服务架构下 Spring Boot 整合 SA-Token 使用详解
在现代开发中,微服务架构越来越受到欢迎,而鉴于其复杂性,服务间的认证与授权成为了一个不可或缺的部分。SA-Token 是一款轻量级但功能强大的 Java 权限认证框架,可以很好地与 Spring Boot 整合使用。本文将详细介绍如何在 Spring Boot 项目中集成 SA-Token,并给出相关代码示例。
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. 配置 SA-Token
接下来,需在 application.yml
或 application.properties
中进行基本配置。这里是一个 YAML 配置示例:
sa-token:
# 是否开启项目中的权限验证,默认启用
is-dev: true
# 超级管理员的token,在这个token下用户不能被注销和无效化
super-token: "admin"
# 过期时间(单位:秒)
timeout: 7200
# token 存储,用于支持不同的存储方式,如 Redis 等
token:
# 是否存入 Redis,默认 false
is-redis: false
3. 编写认证与授权的逻辑
以下是一个简单的用户控制器示例,展示了如何使用 SA-Token 进行基本的认证与授权:
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/user")
public class UserController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 假设在数据库中检查用户
if ("admin".equals(username) && "123456".equals(password)) {
// 登录成功,生成token
StpUtil.login(username);
return "登录成功,Token: " + StpUtil.getTokenValue();
}
return "用户名或密码错误";
}
@GetMapping("/info")
public String info() {
// 需要登录才能访问此接口
StpUtil.checkLogin();
return "用户信息: " + StpUtil.getLoginId();
}
@GetMapping("/logout")
public String logout() {
StpUtil.logout();
return "登出成功";
}
}
在上面的代码中,我们定义了三个接口:
- /login
:接收用户名和密码,进行验证成功后生成 token。
- /info
:获取用户信息,需要验证登录状态。
- /logout
:退出登录,注销当前 token。
4. 整合到 Spring Security(可选)
如果项目中使用了 Spring Security,可以将 SA-Token 和 Spring Security 结合使用。以下是一个简单的示例:
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SaTokenFilter extends BasicAuthenticationFilter {
public SaTokenFilter() {
super();
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
// 从请求中获取token
String token = request.getHeader("Authorization");
if (token != null) {
StpUtil.checkLogin();
}
chain.doFilter(request, response);
}
}
这里我们创建了一个自定义的过滤器,通过读取请求头中的 token,结合 SA-Token 做登录状态的验证。可以在 Spring Security 的配置中将该过滤器添加到过滤链中。
5. 总结
通过以上步骤,我们在 Spring Boot 项目中实现了 SA-Token 的集成与基本使用。SA-Token 简单易用,非常适合用于微服务的认证与授权。根据项目需求,可以进一步扩展权限管理、角色设置以及多服务间的 Token 传递等功能。希望本文能对您的开发有所帮助!