【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: satoken
  timeout: 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 {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public 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;
    }

    @Override
    public 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) {
            // 登录成功,存储 Token
            localStorage.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,实现集中管理和验证。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

肇庆具有资质等保机构有几家?在哪里?

在近期揭晓的“中国百强城市排行榜”中&#xff0c;广东省共有12个城市入选&#xff0c;其中包括肇庆。肇庆-山水之城&#xff0c;文化之韵&#xff0c;端砚之乡&#xff0c;岭南瑰宝&#xff0c;是一个非常有发展的城市&#xff0c;企业多多。这不不少肇庆企业在问&#xff0c…

嵌入式PID算法总结

参考 CMSIS-DSP PID 控制 学习历程 最开始&#xff0c;根据公式自己写PID算法&#xff1b;后面找资料时&#xff0c;发现wiki上介绍PID时&#xff0c;提供了伪代码&#xff0c;直接照着翻译一下就可用了&#xff1b;然后想要实现一个自己的PID库&#xff08;能够实现多级PID…

10条提升大模型任务微调效果的tricks

在大型语言模型&#xff08;LLMs&#xff09;的研究和应用中&#xff0c;如何通过微调来适应特定任务是一个关键问题。尽管提示工程&#xff08;PE&#xff09;在提升LLMs的零样本学习和上下文内学习方面取得了显著成效&#xff0c;但关于如何设计有效的微调样本以进一步提升LL…

Elasticsearch中的Term_Filter过滤器技术

文章目录 一、引言二、Term Filter的工作原理与内部机制三、Term Filter的多样化使用场景3.1 精确匹配3.2 过滤分类与标签3.3 数据范围筛选3.4 复杂查询的构建 四、Term Filter的最佳实践与应用建议4.1 避免使用分析器4.2 优化索引映射4.3 充分利用缓存4.4 持续监控性能 五、结…

Redis 7.x 系列【2】单机部署

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. Windows2. Linux 1. Windows Redis作为一个高性能的内存数据库&#xff0c;和Linu…

查询mysql库表的几个语句

1、查询某个数据库的所有表 SELECTtable_name FROMinformation_schema.TABLES WHEREtable_schema database_namedatabase_name替换成你需要查询的数据库名称 2、查询某张表的所有字段名称 SELECTCOLUMN_NAME,column_comment FROMinformation_schema.COLUMNS WHEREtable…

功能测试 之 单模块测试----购物车模块

1.需求分析 &#xff08;1&#xff09;购物车显示 1.若未登录&#xff0c;提示登录&#xff0c;提示文案“购物车内暂时没有商品&#xff0c;登录后将显示您之前加入的商品” 2.若已登录&#xff0c;购物车没有商品&#xff0c;提示去购物。 未登录状态 已登录状态 3.购物车有…

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存&#xff0c;但彼此之间交互可以在共享的内存中进行&#xff0c;即堆内存&#xff0c;堆内存会将这些消息放到队列中&#xff0c;具体实现jvm见&#xff0c;栈内存各自维护&#xff0c;堆内存大家共享 进…

华为手机怎么找回删除的照片?掌握3个方法,恢复不是梦

由于误删、设备故障、软件更新等原因&#xff0c;我们有时可能会不慎丢失这些宝贵的照片。当面对空空如也的相册时&#xff0c;那种失落感无法言喻。华为手机该怎么找回删除的照片呢&#xff1f;但是&#xff0c;请不要绝望&#xff01;在科技的帮助下&#xff0c;我们可以采取…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…

Unity核心

回顾 Unity核心学习的主要内容 项目展示 基础知识 认识模型制作流程 2D相关 图片导入设置相关 图片导入概述 参数设置——纹理类型 参数设置——纹理形状 参数设置——高级设置 参数设置——平铺拉伸 参数设置——平台设置&#xff08;非常重要&#xff09; Sprite Sprite Edit…

JavaSE 面向对象程序设计进阶 抽象类和接口 2024年详解

目录 抽象类 抽象方法 抽象类和抽象方法的注意事项 ​编辑 接口 如何定义接口 注意 代码实现 ​编辑 接口中的成员特点 接口和类之间的关系 1.类与类的关系 2.类与接口的关系 3.接口与接口的关系 ​编辑 拓展 接口中的默认方法 接口中的静态方法 ​编辑 接口…

网站配置https,购买ssl证书,配置域名,配置nginx,实现安全访问

文章目录 前言一. 域名1. 购买域名2. 添加记录 二. ssl证书创建测试证书购买正式证书证书签发证书申请提交审核DNS验证审核通过下载证书 三. 部署nginx上传ssl证书配置nginx.conf文件找到nginx.conf文件编辑nginx.conf文件重启nginx 前言 当你创建了一个网站后&#xff0c;通过…

73. UE5 RPG 优化投射物以及敌人生成

解决发射物会与地面产生交互的问题 之前一直遇到发射物的体积过大会在发射时&#xff0c;和地面产生交互&#xff0c;我们可以调整小一些&#xff0c;然后为了防止它和自身产生交互事件。我们可以实现它在生成后&#xff0c;不会触发相关事件&#xff0c;而是在一定时间后。 对…

振弦式渗压计在土木工程安全监测中的重要性解析

在土木工程领域中&#xff0c;特别是涉及到坝体、隧道、路基等复杂结构的监测与安全管理时&#xff0c;渗压计作为一种关键的测量工具&#xff0c;发挥着举足轻重的作用。其中&#xff0c;振弦式渗压计以其独特的优点&#xff0c;得到了广泛的应用和认可。本文将对振弦式渗压计…

一文读懂 HTTP 和 RPC 的区别

随着互联网技术的发展&#xff0c;网络通信在各种应用中扮演着至关重要的角色。无论是构建 Web 应用还是进行服务之间的交互&#xff0c;选择合适的通讯协议成为开发者们需要深入思考的问题。在众多协议中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff09;…

【IEEE ACCESS】论文发表记录 2

上次发IEEE ACCESS 感觉不错&#xff0c;速度较快&#xff0c;审稿费也不太夸张&#xff0c;这次梅开二度&#xff0c;希望好运。 官网&#xff1a;IEEE Access: The Multidisciplinary Open Access Journal 期刊水平&#xff1a; 范围认证 -中国科学院文献情报中心期刊分区表…

VBA学习(13):获取多层文件夹内文件名并建立超链接

代码使用了FileSystemObject对象和递归的方法实现文件夹和文件的遍历功能。分别将文件夹名称和文件名提取在表格的A/B列&#xff0c;并对文件名创建了超链接。 示例代码如下&#xff1a; Sub AutoAddLink()Dim strFldPath As StringWith Application.FileDialog(msoFileDialog…

好用的便签是什么 电脑桌面上好用的便签

作为一名文字工作者&#xff0c;我经常需要在繁杂的思绪中捕捉灵感&#xff0c;记录下那些一闪而过的想法。在寻找一款适合电脑桌面的便签应用时&#xff0c;我偶然发现了敬业签便签软件简直是为我量身定制的&#xff0c;它不仅界面简洁&#xff0c;操作便捷&#xff0c;更重要…