【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

相关文章

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot