当前位置:

首页 > 编程开发 > Sa-Token+JWT集成到SpringBoot完整指南

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

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

一、Sa-Token 是干什么的?

简单来说,Sa-Token 就是一套 Ja va 认证授权框架,干的事无非这几件:

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/a vatar → 任何人都能下载

改造后

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

Header: Authorization: token值

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

三、集成步骤

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:
签名密钥,随便写一段字符串
secret-key: abcdefghijklmnopqrstuvwxyz0123456789
token 签发者
issuer: test-project

3.3 SaTokenConfig.ja va — 配置拦截器

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

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.ja va — 加登录接口

// ========== 登录 ==========
@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 就能验证身份,适合分布式场景。

五、业务代码中如何使用

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");

六、前端请求方式

# 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      │ 登录认证、token 管理、权限校验、请求拦截         │
├───────────────┼────────────────────────────────────────────────┤
│ JWT           │ Token 的格式标准(用户信息编码在 token 中)     │
├───────────────┼────────────────────────────────────────────────┤
│ SaInterceptor │ 自动拦截未登录请求,不用每个 Controller 写判断 │
├───────────────┼────────────────────────────────────────────────┤
│ StpUtil       │ 核心工具类,登录/登出/获取用户/校验权限         │
└───────────────┴────────────────────────────────────────────────┘
本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

Java测试中怎么使用Mockito模拟依赖对象
Java测试中怎么使用Mockito模拟依赖对象

详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

链表删除节点的时间复杂度是多少及其详细分析
链表删除节点的时间复杂度是多少及其详细分析

详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

codex如何配置模型参数及文件设置教程
codex如何配置模型参数及文件设置教程

想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

Claude Code AI编程工具实力揭秘与编程助手实测
Claude Code AI编程工具实力揭秘与编程助手实测

通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

winforms教程自学入门与基础开发步骤详解
winforms教程自学入门与基础开发步骤详解

本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

Cursor自动补全设置教程教你快速开启代码补全功能
Cursor自动补全设置教程教你快速开启代码补全功能

详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

pandas的数据格式怎么转换和设置方法教程
pandas的数据格式怎么转换和设置方法教程

详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。