当前位置: 首页
编程语言
SpringBoot集成Sa-Token与JWT完整指南

SpringBoot集成Sa-Token与JWT完整指南

时间:2026-07-28
转载

Sa-Token集成JWT到SpringBoot,通过配置拦截器实现登录认证、权限校验与Token管理。登录成功生成JWT令牌,前端携带令牌访问受保护接口,支持角色和权限校验,无状态适用于分布式与微服务场景。

一、Sa-Token 是什么?它主要实现哪些功能?

简单来说,Sa-Token 是一套基于 Java 的认证授权框架,主要完成以下功能:

Sa-Token+JWT集成到SpringBoot完整指南

┌────────────┬───────────────────────────────────────────────────────┐
│ 功能       │ 说明                                                 │
├────────────┼───────────────────────────────────────────────────────┤
│ 登录认证   │ 用户输入账号密码后,系统签发 token,后续请求需携带 token 访问 │
├────────────┼───────────────────────────────────────────────────────┤
│ 权限校验   │ 判断用户是否拥有某个权限或角色                       │
├────────────┼───────────────────────────────────────────────────────┤
│ Token 管理 │ token 的生成、存储、过期、续期                         │
├────────────┼───────────────────────────────────────────────────────┤
│ 拦截器     │ 自动拦截未登录的请求,返回 401 状态码                   │
└────────────┴───────────────────────────────────────────────────────┘

JWT(JSON Web Token)是一种轻量级的 Token 格式。Sa-Token 默认使用随机字符串作为 token,如果你需要自包含的令牌,切换到 JWT 格式也非常简便。

二、集成 Sa-Token 前后项目功能对比

改造前(现在)

  • POST /api/users → 任何人都可以访问,无需登录认证
  • GET /api/users/1 → 任何人都能查询用户信息
  • GET /api/users/1/avatar → 任何人都能下载头像

改造后

  • POST /api/users/login → 登录接口,返回 token
  • GET /api/users/1 → 需要携带有效 token 才能访问

Header: Authorization: token值

  • DELETE /api/users/1 → 需要管理员权限才能删除

三、Spring Boot 集成 Sa-Token + JWT 具体步骤

3.1 在 pom.xml 中添加依赖



    cn.dev33
    sa-token-spring-boot3-starter
    1.39.0



cn.dev33
sa-token-redis-jackson
1.39.0



cn.dev33
sa-token-jwt
1.39.0

3.2 application.yml 配置文件

############## Sa-Token 配置 ##############
sa-token:
  # token 名称,同时作为 cookie 名称
  token-name: Authorization
  # token 有效期(秒),7 天
  timeout: 604800
  # 是否允许同一账号同时在线
  is-concurrent: true
  # 是否允许同一账号多地登录
  is-share: true
  # token 风格(可选:uuid、simple-uuid、random-32、random-64、random-128)
  token-style: uuid
  # 是否输出操作日志
  is-log: true
配置 JWT
jwt:
JWT 签名密钥,可自定义字符串
secret-key: abcdefghijklmnopqrstuvwxyz0123456789
token 签发者
issuer: test-project

3.3 SaTokenConfig.java — 配置拦截器

新建文件:src/main/java/com/test/config/SaTokenConfig.java

package com.test.config;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // 注册 Sa-Token 拦截器
    registry.addInterceptor(new SaInterceptor(handle -> {
        // 登录校验:拦截需要登录的路径
        SaRouter.match("/api/**")
                .notMatch("/api/users/login")
                .notMatch("/api/users/register")
                .check(r -> StpUtil.checkLogin());
    // 角色校验示例:仅 admin 角色可删除用户
    SaRouter.match("/api/users/**", r -> {
        if (handle.getRequest().getMethod().equals("DELETE")) {
            StpUtil.checkRole("admin");
        }
    });
})).addPathPatterns("/**");
}
}

3.4 修改 UserController.java — 添加登录接口

// ========== 登录接口 ==========
@PostMapping("/login")
public Map login(@RequestBody Map params) {
    String username = params.get("username");
    String password = params.get("password");
// 校验用户名和密码
User user = userService.getUserByUsername(username);
if (user == null || !user.getPassword().equals(password)) {
    return Map.of("success", false, "message", "用户名或密码错误");
}
// 登录成功,生成 token
StpUtil.login(user.getId());
String tokenValue = StpUtil.getTokenValue();
return Map.of("success", true, "message", "登录成功", "token", tokenValue, "user", user);
}
@GetMapping("/logout")
public Map logout() {
StpUtil.logout();
return Map.of("success", true, "message", "退出成功");
}
// 查看当前登录用户信息
@GetMapping("/me")
public Map me() {
long userId = StpUtil.getLoginIdAsLong();
User user = userService.getUserById(userId);
return Map.of("success", true, "user", user);
}

四、JWT 在 Sa-Token 认证流程中的作用

用户登录成功
↓
StpUtil.login(用户ID)
↓
Sa-Token 生成 Token
↓
默认格式:随机字符串 → "d8f9a0e1-2b3c-4d5e-..."
JWT 格式:令牌 → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
↓
返回给前端
↓
前端每次请求携带此 token

JWT 的核心优势在于:Token 本身包含了用户信息(如用户ID、过期时间等),服务端无需查询数据库或 Redis 即可验证身份,非常适合分布式部署场景。

五、在业务代码中如何使用 Sa-Token 进行权限管理

5.1 获取当前登录用户

// 在 Controller 或 Service 中
long userId = StpUtil.getLoginIdAsLong(); // 获取当前登录用户的 ID
User user = userService.getUserById(userId);

5.2 校验权限与角色

// 判断是否已登录
StpUtil.isLogin()      // 返回 true/false
StpUtil.checkLogin()   // 未登录则抛出异常,返回 401
// 判断角色
StpUtil.hasRole("admin")    // 返回 true/false
StpUtil.checkRole("admin")  // 无权限则抛出异常
// 判断权限标识
StpUtil.hasPermission("user:delete")  // 返回 true/false

5.3 设置用户角色和权限

在登录成功时或 User 实体中定义:

// 登录成功后为用户分配角色
StpUtil.login(userId);
StpUtil.getTokenSession().set("role", "admin");

六、前端通过 HTTP 请求与 Sa-Token 交互示例

# 步骤1:登录获取 token
curl -X POST http://localhost:8080/api/users/login 
  -H "Content-Type: application/json" 
  -d '{"username":"admin","password":"123456"}'
返回:
{"success":true,"token":"eyJhbGciOiJIUzI1NiIs...","user":{...}}
步骤2:后续请求携带 token
curl http://localhost:8080/api/users/1 
-H "Authorization: eyJhbGciOiJIUzI1NiIs..."
步骤3:查看个人信息
curl http://localhost:8080/api/users/me
-H "Authorization: eyJhbGciOiJIUzI1NiIs..."

七、生产环境部署注意事项

1. 密码必须加密存储

当前数据库中的密码为明文 123456,生产环境务必使用加密算法:

// 注册时加密
String encodedPassword = BCrypt.gensalt().encode(password);
// 登录时校验
boolean matches = BCrypt.checkpw(inputPassword, user.getPassword());

2. 返回用户信息时需隐藏密码字段

// 序列化时忽略密码字段
@JsonIgnore
private String password;

3. 合理配置拦截器路径

  • /api/users/login → 不拦截(允许用户登录)
  • /api/users/register → 不拦截(允许用户注册)
  • /api/** → 拦截(需要登录)
  • /api/admin/** → 拦截(需要管理员角色)

八、总结:Sa-Token + JWT 集成方案总览

┌───────────────┬────────────────────────────────────────────────┐
│ 组件          │ 在这个项目中的作用                             │
├───────────────┼────────────────────────────────────────────────┤
│ Sa-Token      │ 登录认证、token 管理、权限校验、请求拦截         │
├───────────────┼────────────────────────────────────────────────┤
│ JWT           │ Token 的格式标准(用户信息编码在 token 中)     │
├───────────────┼────────────────────────────────────────────────┤
│ SaInterceptor │ 自动拦截未登录请求,无需在每个 Controller 中编写判断逻辑 │
├───────────────┼────────────────────────────────────────────────┤
│ StpUtil       │ 核心工具类,提供登录/登出/获取用户/校验权限等操作 │
└───────────────┴────────────────────────────────────────────────┘

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
35岁转行网络安全:从经验复用到实战落地的可行性评估

35岁转行网络安全:从经验复用到实战落地的可行性评估

35岁转行网络安全并非不可行,但核心在于将过往经验转化为安全领域的差异化优势。本文从岗位匹配度、技能学习顺序、实战验证闭环、求职策略及常见误区五个维度,提供一套可执行的转行评估框架与行动指南,帮助读者理性判断投入产出比,避开无效学习陷阱。

时间:2026-10-10 18:07
网络安全行业前景分析:技术演进与市场机遇

网络安全行业前景分析:技术演进与市场机遇

围绕2026年网络安全行业的发展变化,从市场需求、技术演进、细分赛道和企业落地四个层面展开,帮助读者理解行业增长逻辑、识别重点技术方向,并建立评估市场机遇与风险的基本框架。 OWASP China +2 IDC +2

时间:2026-10-10 18:02
2026网络安全求职全景:从岗位拆解到实战作品集构建

2026网络安全求职全景:从岗位拆解到实战作品集构建

本文基于2026年网络安全行业招聘趋势,深入剖析安全运维、攻防渗透、云安全等核心岗位的技术栈差异与能力侧重。文章不仅梳理了从基础网络知识到高级攻防演练的学习路径,更提供了“以终为始”的求职策略:通过拆解JD反向验证技能缺口,并指导如何将CTF经历、HomeLab实验转化为具有说服力的项目作品集,帮助

时间:2026-10-10 17:57
2024安全攻防实战:从勒索软件到AI治理的破局与重构

2024安全攻防实战:从勒索软件到AI治理的破局与重构

2024年的网络安全已从单纯的技术对抗演变为业务连续性的生死博弈。本文基于ENISA、微软及世界经济论坛的最新报告,深入剖析勒索软件的“双重勒索”演变、身份凭证成为首要攻击面的现状,以及生成式AI带来的攻防不对称性。文章进一步拆解企业如何从被动防御转向“发现-保护-检测-响应-恢复”的闭环体系,重点

时间:2026-10-10 17:52
网站编程AI工具测评:提升开发效率的辅助软件推荐

网站编程AI工具测评:提升开发效率的辅助软件推荐

围绕网站开发中的实际需求,对AI编程辅助工具进行分类、操作体验与效果验证,帮助读者快速判断哪些工具真正能提升开发效率,并避开代码质量、隐私、安全与过度依赖等常见问题。

时间:2026-10-10 17:47
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全