【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

相关文章

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

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

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

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程