【Sa-Token|3】Sa-Token集成到现有微服务详细介绍

2024-06-22 01:44

本文主要是介绍【Sa-Token|3】Sa-Token集成到现有微服务详细介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

一、系统架构调整

  1. 用户中心:保持现有的用户登录、注册接口不变。
  2. 多个项目:前后端分离,保持现有逻辑不变。
  3. 网关服务:新增或配置网关服务,处理所有请求并进行 Token 校验和转发。
  4. 统一 Token 管理:通过 Sa-Token 统一管理 Token,前后端项目依然调用用户中心接口,但通过网关服务进行 Token 校验和转发。

二、具体改造步骤

1. 引入 Sa-Token 进行统一 Token 管理

在用户中心中引入 Sa-Token,实现登录时生成 Token,并返回给客户端。

用户中心登录接口示例:

@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public SaResult login(@RequestParam String username, @RequestParam String password) {// 进行用户名和密码校验if (checkCredentials(username, password)) {StpUtil.login(username);return SaResult.ok("登录成功").set("token", StpUtil.getTokenValue());}return SaResult.error("登录失败");}private boolean checkCredentials(String username, String password) {// 检查用户名和密码逻辑return true; // 假设校验成功}
}

用户中心 Token 校验接口示例:

@RestController
@RequestMapping("/auth")
public class AuthController {@GetMapping("/check")public SaResult checkToken(@RequestParam String token) {if (StpUtil.isLogin(token)) {return SaResult.ok("Token 有效");}return SaResult.error("Token 无效");}
}
2. 配置 Sa-Token 在各项目中的使用

在每个项目的配置文件中添加 Sa-Token 配置,确保所有项目使用相同的 Token 配置。

application.yml

sa-token:token-name: satokentimeout: 86400  # Token 过期时间,单位秒activity-timeout: -1  # Token 最后活跃时间is-concurrent: false  # 是否允许多地登录is-share: true  # 是否共享会话
3. 配置网关服务

网关服务负责拦截所有请求,并对 Token 进行校验。使用 Spring Cloud Gateway 作为示例:

网关服务 Token 校验过滤器:

@Component
public class TokenFilter implements GlobalFilter, Ordered {@Autowiredprivate RestTemplate restTemplate;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (token != null && checkToken(token)) {return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}private boolean checkToken(String token) {// 调用用户中心的 Token 校验接口String url = "http://user-center/auth/check?token=" + token;ResponseEntity<SaResult> response = restTemplate.getForEntity(url, SaResult.class);return response.getStatusCode() == HttpStatus.OK && response.getBody().getCode() == 200;}@Overridepublic int getOrder() {return -100;}
}
4. 前端项目处理登录逻辑

前端项目在用户登录成功后,将 Token 存储在浏览器的本地存储或 Cookie 中,并在每次请求时携带 Token。

前端登录逻辑示例:

async function login(username, password) {try {const response = await axios.post('/auth/login', { username, password });if (response.data.code === 200) {// 登录成功,存储 TokenlocalStorage.setItem('token', response.data.data.token);return true;}return false;} catch (error) {console.error('登录失败', error);return false;}
}// 在每次请求时携带 Token
axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = token;}return config;
}, error => {return Promise.reject(error);
});

三、总结

通过上述步骤,可以在不改变现有业务逻辑的基础上,实现三个项目的单点登录:

  1. 用户中心:继续处理用户登录和注册,并通过 Sa-Token 生成和验证 Token。
  2. 各个项目:通过网关服务转发请求和校验 Token,不需要改变现有的业务逻辑。
  3. 网关服务:统一拦截请求并校验 Token,实现集中管理和验证。

这种方式可以最小化改造工作量,实现单点登录的目标。

这篇关于【Sa-Token|3】Sa-Token集成到现有微服务详细介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082941

相关文章

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1