当前位置: 首页 > news >正文

Spring Boot 整合 SA-Token 使用详解

Spring Boot 整合 SA-Token 使用详解

在现代Web开发中,用户认证与授权是构建安全应用的基础。SA-Token是一个轻量级的Java权限认证框架,它以其简洁的API设计、高效的执行效率以及丰富的功能特性,成为了众多开发者在Spring Boot项目中实现用户认证与授权的首选方案。本文将详细介绍如何在Spring Boot项目中整合SA-Token,包括环境搭建、基本使用、高级功能以及最佳实践等内容。

一、SA-Token 简介

SA-Token是一个基于Token的Java权限认证框架,主要解决:登录认证、权限认证、Session会话、踢出登录、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。SA-Token以“简单、易用、安全”为设计目标,致力于打造一个轻量级的权限认证框架。

二、环境搭建
1. 引入SA-Token依赖

首先,你需要在Spring Boot项目的pom.xml文件中引入SA-Token的Maven依赖。SA-Token的最新版本可以通过其GitHub仓库或Maven中央仓库查询。

<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>你的SA-Token版本号</version>
</dependency>
2. 配置application.yml

通常,SA-Token不需要过多的配置即可直接使用。但你可以通过application.ymlapplication.properties文件对SA-Token进行一些基础配置,如Token名称、Token有效期等。

sa-token:# token名称 (同时也是cookie名称)token-name: Authorization# token有效期,单位s, 默认30天, -1代表永不过期timeout: 2592000# token临时有效期 (指定时间内无操作, token自动延长有效期),单位s, 默认0代表不自动续期activity-timeout: -1# 是否允许同一账号并发登录 (为多个设备登录同一账号的情况提供支持)is-concurrent: true# 是否允许在浏览器中存储token (默认为false,存储在内存中,关闭浏览器则失效)is-remember-me: false# 在多人登录同一账号时, 是否互相踢下线(默认true)is-kick-online: true# token风格token-style: jwt
三、基本使用
1. 登录认证

SA-Token提供了简单的登录认证API,你可以通过调用StpUtil.login()方法实现用户登录,并生成Token。

@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public ResponseEntity<?> login(@RequestBody User user) {// 假设这是你的用户验证逻辑if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) {// 登录成功,将id作为主键存入StpUtil.login(user.getId());return ResponseEntity.ok("登录成功");}return ResponseEntity.badRequest().body("登录失败");}
}
2. 权限认证

SA-Token通过@SaCheckPermission注解和StpUtil.checkPermission()方法提供权限认证功能。

@RestController
@RequestMapping("/admin")
public class AdminController {@GetMapping("/info")@SaCheckPermission("admin.info")public ResponseEntity<?> getInfo() {return ResponseEntity.ok("这是管理员信息");}// 或者在方法内部手动检查@GetMapping("/data")public ResponseEntity<?> getData() {// 校验当前用户是否含有admin.data权限if (StpUtil.checkPermission("admin.data")) {return ResponseEntity.ok("这是管理员数据");}return ResponseEntity.status(HttpStatus.FORBIDDEN).body("权限不足");}
}
3. 会话管理

SA-Token支持基于Token的会话管理,包括获取当前会话信息、注销会话等。

// 获取当前会话的Token信息
Object tokenValue = StpUtil.getTokenValue();// 注销当前会话
StpUtil.logout();// 强制使某个Token失效(通过Token值)
StpUtil.logoutByTokenValue(tokenValue);
四、高级功能

SA-Token不仅仅局限于基本的登录和权限认证,它还提供了许多高级功能,以满足更复杂的安全需求。

1. 角色认证

SA-Token支持基于角色的访问控制(RBAC)。你可以通过StpUtil.setRole()方法为用户设置角色,并通过@SaCheckRole注解或StpUtil.checkRole()方法检查用户是否拥有特定角色。

// 登录时设置角色
StpUtil.login(userId).setRole("admin");// 控制器方法中使用角色认证
@GetMapping("/admin/dashboard")
@SaCheckRole("admin")
public ResponseEntity<?> adminDashboard() {return ResponseEntity.ok("管理员控制面板");
}// 或者在方法内部检查
if (StpUtil.checkRole("admin")) {// 执行管理员相关操作
}
2. 权限字符串模式

SA-Token允许你定义复杂的权限字符串模式,以实现更细粒度的权限控制。例如,你可以使用通配符来匹配多个权限。

// 赋予用户多个权限
StpUtil.setPermission("user.add", "user.delete", "user.update.*");// 检查用户是否拥有“user.update”下任意权限
if (StpUtil.checkPermission("user.update.*")) {// 允许执行相关操作
}
3. 自定义Token处理器

SA-Token允许你通过实现TokenProcessor接口来自定义Token的生成、解析和验证逻辑。这对于有特殊Token格式或加密需求的应用非常有用。

@Component
public class CustomTokenProcessor implements TokenProcessor {// 实现自定义的Token处理逻辑
}// 在配置类中指定自定义的Token处理器
@Configuration
public class SaTokenConfig {@Beanpublic TokenProcessor tokenProcessor() {return new CustomTokenProcessor();}
}
4. 集成OAuth2.0

SA-Token支持OAuth2.0协议,允许你轻松实现第三方登录功能。你可以通过配置OAuth2.0客户端信息,并使用SA-Token提供的OAuth2.0工具类来处理登录流程。

// 配置OAuth2.0客户端
@Bean
public OAuth2Template oAuth2Template(RestTemplate restTemplate) {OAuth2Template template = new OAuth2Template("clientId", "clientSecret", "authorizationServerUrl");// 设置其他OAuth2.0参数return template;
}// 控制器中处理OAuth2.0登录
@GetMapping("/oauth/login")
public String oauthLogin(HttpServletRequest request) {// 发起OAuth2.0登录请求,并处理回调// ...return "redirect:/login/success";
}

注意:上面的OAuth2.0集成示例是概念性的,SA-Token本身并不直接提供OAuth2.0客户端实现。你需要结合Spring Security OAuth2或其他OAuth2.0客户端库来实现。

5. 微服务鉴权

在微服务架构中,SA-Token可以通过网关层进行统一的鉴权。你可以将SA-Token与Spring Cloud Gateway或Zuul等网关集成,实现API级别的访问控制。

// 网关路由配置中加入鉴权过滤器
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(p -> p.path("/api/**").filters(f -> f.stripPrefix(1).filter(new SaTokenAuthGlobalFilter())) // 自定义SA-Token鉴权过滤器.uri("lb://your-service")).build();
}// 实现SaTokenAuthGlobalFilter鉴权过滤器
public class SaTokenAuthGlobalFilter implements GlobalFilter, Ordered {// ... 实现鉴权逻辑@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 校验Token,处理权限等// ...return chain.filter(exchange);}@Overridepublic int getOrder() {return -1; // 优先级设置}
}
五、最佳实践(续)
  1. Token存储与过期管理

    • 确保Token在客户端(如浏览器、移动应用)的存储方式是安全的,避免敏感信息泄露。
    • 合理使用Token的过期时间,根据应用的安全需求和用户体验来设置。过短的过期时间会增加用户的登录频率,而过长的过期时间可能会增加Token被滥用的风险。
    • 利用SA-Token提供的自动续签功能(如果可用),以减少用户因Token过期而需要重新登录的情况。
  2. 日志与监控

    • 记录所有与认证和授权相关的日志,包括登录尝试、权限检查等,以便于审计和排查安全问题。
    • 监控认证服务的性能和稳定性,确保在高并发情况下也能正常工作。
    • 设置警报系统,以便在发生异常登录尝试、权限滥用等安全事件时及时通知管理员。
  3. 定期审计与安全培训

    • 定期对系统的权限配置、用户角色和Token管理进行审计,确保没有安全漏洞。
    • 对开发人员和运维人员进行安全培训,提高他们对安全最佳实践的认识和遵守程度。
  4. 使用HTTPS和HSTS

    • 确保所有与Token传输相关的请求都通过HTTPS进行,以保护Token在传输过程中的安全。
    • 启用HTTP严格传输安全(HSTS)策略,强制浏览器通过HTTPS与服务器建立连接,即使URL以http://开头。
  5. 遵循最小权限原则

    • 在分配权限时,应遵循最小权限原则,即只授予用户完成其工作所需的最小权限集合。
    • 定期检查并清理不再需要的权限和角色,以减少潜在的安全风险。
  6. Token泄露应对措施

    • 制定Token泄露的应急响应计划,包括如何快速定位泄露源、通知受影响的用户、撤销泄露的Token等。
    • 定期对Token的存储和传输机制进行安全评估,以发现潜在的安全漏洞并及时修复。
  7. 集成第三方安全工具

    • 考虑集成第三方安全工具,如Web应用防火墙(WAF)、入侵检测/防御系统(IDS/IPS)等,以增强系统的安全防护能力。
    • 利用这些工具来监控和阻止潜在的恶意访问和攻击行为。
  8. 持续更新与升级

    • 密切关注SA-Token和相关依赖库的更新和漏洞信息,及时应用安全补丁和更新。
    • 定期评估并升级系统的安全配置和策略,以适应不断变化的安全威胁和最佳实践。

通过遵循这些最佳实践,你可以有效地提高SA-Token在你的应用中的安全性和可靠性。同时,这些实践也适用于其他认证和授权框架和库,为你的应用提供全面的安全保障。

相关文章:

Spring Boot 整合 SA-Token 使用详解

Spring Boot 整合 SA-Token 使用详解 在现代Web开发中&#xff0c;用户认证与授权是构建安全应用的基础。SA-Token是一个轻量级的Java权限认证框架&#xff0c;它以其简洁的API设计、高效的执行效率以及丰富的功能特性&#xff0c;成为了众多开发者在Spring Boot项目中实现用户…...

1.3 C 语言入门实战:从 Hello World 到基础语法解析

目录 1 程序的作用 2 初识 Hello World 2.1 新建项目 2.2 程序解释 3 printf 的作用 4 注释及其注意事项 4.1 单行注释 4.2 多行注释 4.3 嵌套错误 5 项目在磁盘上的位置 1 程序的作用 如下图所示&#xff0c;我们编写了一个可以做加法的程序&#xff0c;我们给程序…...

一文读懂什么是Go语言goroutine

1. 进程、线程和协程的区别 进程: 进程是具有一定独立功能的程序&#xff0c;进程是系统资源分配和调度的最小单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。由于进程比较重量&#xff0c;占据独立的内存&#xff0c;所以上下文进程间的切换…...

计算机毕业设计 农家乐管理平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

Spring Boot优缺点

Spring Boot 是一款用于简化Spring应用开发的框架&#xff0c;它集成了大量常用的框架和工具&#xff0c;大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点&#xff1a; 优点&#xff1a; 简化配置&#xff1a;Spring Boot自动配置功能可以根据应用的依赖自动配…...

Android Studio中创建apk签名文件

本文以macOS中Android Studio 2021.1.1版本为例介绍创建apk签名文件的操作步骤&#xff1a; 1.启动Android Studio&#xff0c;并打开一个Android项目。 2.依次点击菜单&#xff1a;Build -> Generate Signed Bundle / APK...。 3.在弹出的"Generate Signed Bundle or …...

CRC32 JAVA C#实现

项目中用到CRC32进行校验得地方&#xff0c;需要用到C#和java进行对比&#xff1a; 一、C#实现&#xff1a; class CRC32Cls { protected ulong[] Crc32Table; //生成CRC32码表 public void GetCRC32Table() { ulong Crc; …...

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用 ​ 有了前面几篇文章的铺垫&#xff0c;现在已经可以实现我到手测试那一步的 1.解读usb_websocket_display.launch.py ​ 首先进入这个目录/root/dev_ws/src/origincar/originca…...

深入学习小程序第二天:事件处理与用户交互

一、概念 1. 事件绑定与类型 在小程序中&#xff0c;通过在组件上添加特定的属性&#xff08;如 bind 开头的属性&#xff09;来绑定事件处理函数&#xff0c;以响应用户的交互操作。常见的事件类型包括触摸事件、表单事件和系统事件&#xff1a; 触摸事件&#xff1a;用于响…...

操作系统快速入门(一)

&#x1f600;前言 本篇博文是关于操作系统的&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&…...

Spring Cloud微服务性能优化:策略、实践与未来趋势

标题&#xff1a;Spring Cloud微服务性能优化&#xff1a;策略、实践与未来趋势 摘要 在微服务架构中&#xff0c;服务调用链路的性能优化是确保系统高效运行的关键。Spring Cloud作为微服务架构的主流实现之一&#xff0c;提供了多种工具和方法来优化服务间的调用。本文将深…...

秒懂C++之多态

目录 一. 多态的概念 二. 多态的定义及实现 多态的构成条件 虚函数重写的例外 协变(基类与派生类虚函数返回值类型不同) 析构函数的重写(基类与派生类析构函数的名字不同) 练习例题 final override 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类 四. 多态的原理…...

C语言:求最大数不用数组

&#xff08;1&#xff09;题目&#xff1a; 输入一批正数用空格隔开&#xff0c;个数不限&#xff0c;输入0时结束循环&#xff0c;并且输出这批整数的最大值。 &#xff08;2&#xff09;代码&#xff1a; #include "stdio.h" int main() {int max 0; // 假设输入…...

零门槛成为HelpLook推荐官,邀好友加入,奖励享不停!

什么&#xff01;&#xff1f; 还有谁不知道HelpLook推荐官计划&#xff01; 只需要简单地注册加入 在好友成功订阅套餐之后 可一次性获得20%的丰厚现金返佣 HelpLook是一款快速搭建AI知识库的系统&#xff0c;并帮助企业0代码搭建帮助中心、FAQs、SOPs、产品文档、说明书和…...

基于python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

利用formdata自动序列化和xhr上传表单到后端

//FormData对象是XMLHTTPRequest level2新增的类型&#xff0c;它可以自动序列化表单内容&#xff0c;不再需要我们去写序列化表单方法&#xff1b; FormData()即可以直接把整个表单给它&#xff0c;也可以分别使用append(‘字段’,‘值’)方法给FormData()&#xff1b; 现在就…...

视频号小店大地震?还好我看了原文

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我X&#xff0c;如果不是看了原文&#xff0c;我差点也上当了。虽然视频号小店关闭了450个类目&#xff0c;但又重新开放了412个类目啊。 昨天&#xff08;8月9日&#xff09;&#xff0c;视频号一口气发了10个公…...

Genymotion adb shell

Genymotion 账户是 qq邮箱 参考 Ubuntu 20.04 安装 Android 模拟器 Genymotion https://www.zzzmh.cn/post/553cd96d4e47490a90b3302a76a93c0d Genymotion adb shell adb shell C:\Program Files\Genymobile\Genymotion\tools>adb shell lsusb Bus 001 Device 001: ID …...

探索AI与社交的交汇点:看Facebook如何引领智能化革命

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正成为各大科技公司变革的重要驱动力。作为全球领先的社交媒体平台&#xff0c;Facebook&#xff08;现Meta Platforms&#xff09;正处于这一智能化革命的前沿。通过不断创新和应用AI技术&#xff0c;Facebook…...

JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?

在JVM&#xff08;Java虚拟机&#xff09;的类加载过程中&#xff0c;Class对象的加载位置涉及到堆&#xff08;Heap&#xff09;和方法区&#xff08;Method Area&#xff09;两个关键区域。具体来说&#xff0c;类的加载阶段涉及到将类的.class文件中的二进制数据读入到内存中…...

Android 获取短信验证

Android 获取短信验证 Android 获取短信验证 输入发短信的手机号&#xff0c;点击获取验证码&#xff0c;等接收到验证码后就会自动获取 SmsReceiver.Java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; impor…...

负载均衡详细概念介绍之(四层和七层实现)

目录 一、负载均衡介绍 1.1什么是负载均衡 ​编辑 1.2 为什么要用负载均衡 二、负载均衡的类型 2.1 通过一些硬件实现 2.2 四层负载均衡 2.3 七层负载均衡 三、四层和七层的区别 及特点 一、负载均衡介绍 1.1什么是负载均衡 负载均衡:Load Balance&#xff0c;简称LB&a…...

力扣 | 递增子序列 | 动态规划 | 最长递增子序列、最长递增子序列的个数、及其变式

文章目录 一、300. 最长递增子序列二、673. 最长递增子序列的个数三、变式1、646. 最长数对链2、1218. 最长定差子序列3、1027. 最长等差数列4、354. 俄罗斯套娃信封问题5、1964. 找出到每个位置为止最长的有效障碍赛跑路线 最长递增子序列&#xff1a;原序-递增数值问题 最长定…...

008 | 基于RNN和LSTM的贵州茅台股票开盘价预测

基于RNN和LSTM的贵州茅台股票开盘价预测 项目简介&#xff1a; 本项目旨在通过使用Tushare下载贵州茅台的股票数据&#xff0c;并基于这些历史数据&#xff0c;使用TensorFlow 2.0实现循环神经网络&#xff08;RNN&#xff09;和长短期记忆网络&#xff08;LSTM&#xff09;来…...

尚硅谷谷粒商城项目笔记——六、使用navciat连接docker中的mysql容器【电脑CPU:AMD】

六、使用navciat连接docker中的mysql容器 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 1navicat免费…...

【git】本地更改了,但又想直接从远端拉取覆盖本地(放弃本地更改前行下载)

拉取时错误信息 error: cannot pull with rebase: You have unstaged changes. error: Please commit or stash them.个错误信息表明你在尝试使用git pull --rebase命令时&#xff0c;你的工作目录中存在未提交的更改&#xff08;即未暂存&#xff08;unstaged&#xff09;的更…...

基于JSP的书店仓库管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 管理员功能模块 用户功能模块 员工功能模…...

pytorch框架保存和加载模型

在 PyTorch 中&#xff0c;有几种常见的方法来保存和加载模型&#xff0c;具体方法取决于你想保存什么内容&#xff08;例如&#xff0c;只保存模型的权重&#xff0c;还是保存整个模型&#xff09;。下面我将介绍几种常见的保存和加载模型的方法。 1、保存和加载模型的 state…...

开发输出防护栏以检测GPT-4o幻觉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

代码复现,代码改进,算法复现,模型复现

目前空闲可接硕士&#xff0c;博士&#xff0c;代码复现&#xff0c;改进代码&#xff0c;文献复现&#xff0c;算法复现&#xff0c;模型复现&#xff0c;文章复现&#xff0c;科研复现&#xff0c;可定制创新点&#xff0c;对比&#xff0c;模块&#xff0c;创新思路&#xf…...