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

news2024/11/25 0:41:32

在这里插入图片描述

一、系统架构调整

  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,实现集中管理和验证。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色

目录 引出第五讲 文本编程新建项目输入线的初始化根据字体大小定义插入符大小创建图形插入符文字始终保存在窗口中CString类通过字符串资源 路径层字符输入的功能键盘输入消息鼠标左键消息保存点击位置的坐标 输入回车键的处理删除文字的实现 字符输入功能代码字体的修改模拟卡…

js如何使得四舍五入的百分比之和为100%

在JavaScript中&#xff0c;如果你想要确保一组四舍五入后的百分比之和严格等于100%&#xff0c;那么你不能直接对每个百分比进行四舍五入&#xff0c;因为四舍五入会引入误差。但是&#xff0c;你可以采用一种策略&#xff0c;即先对所有的百分比进行常规的四舍五入&#xff0…

ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装

音视频领域学习ffmpeg的重要性 音视频领域中ffmpeg的广泛应用&#xff0c;包括直播、短视频、网络视频、实时互动和视频监控等领域。掌握FM和音视频技术可以获得更好的薪酬。 学习建议音视频学习建议与实战应用 音视频处理机制的学习&#xff0c;需要勤加练习&#xff0c;带…

WIFI7技术之超强MLO (Multi-Link Operation)技术

随着科技的飞速发展&#xff0c;无线网络已成为我们日常生活中不可或缺的一部分。从最初的WIFI71到现在的WIFI7&#xff0c;无线网络技术不断突破&#xff0c;为用户提供更快、更稳定的网络体验。本文将探讨下WIFI7的MLO&#xff08;Multi-Link Operation&#xff0c;多链路操作…

【SpringBoot3.x】自定义开发通用SDK

1. 前言 相信大家学习SpringBoot到现在&#xff0c;使用Maven构建项目时&#xff0c;会在pom.xml文件中引入各种各样的依赖&#xff0c;那么我们如何将自己常用的一些工具类库进行封装成starter或者SDK供其他项目使用呢&#xff0c;本博客就会带着大家一步一步创建自定义的SDK…

力扣1793.好子数组的最大分数

力扣1793.好子数组的最大分数 对于每个数 求其左右两侧小于它高度的元素下标(单调栈) class Solution {public:int maximumScore(vector<int>& nums, int k) {int n nums.size();vector<int> left(n,-1);stack<int> st;for(int i0;i<n;i){while(!…

技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞&#xff0c;需要对这种流行现象进行数据分析。数据分析首先需要有数据&#xff0c;本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法&#xff0c;大型的网络爬虫多基于成熟的爬虫框架&#…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失&#xff0c;因此就此作罢。对于 macOS 用户来说&#xff0c;当文件被删除时&#xff0c;垃圾箱已被清空&#xff0c;他们可能不知道如何恢…

spring-gateway配置说明

在开发过程中遇到的一些配置问题&#xff0c;记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候&#xff0c;需要指定对应的服务进行添加&#xff0c;根据文档…

算法训练与程序竞赛题目集合(L3)

目录 L3-001 凑零钱 输入格式&#xff1a; 输出格式&#xff1a; 输入样例 1&#xff1a; 输出样例 1&#xff1a; 输入样例 2&#xff1a; 输出样例 2&#xff1a; L3-002 特殊堆栈 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&…

伦敦银趋势线的有效性怎么验证?

怎么才能画出一根能发挥作用的趋势线呢&#xff1f;这是很多投资者追求的目标。其实要趋势线能发挥作用&#xff0c;我们在画它的时候就要进行一些验证&#xff0c;将通过了验证的趋势线保留下来&#xff0c;那些没通过的就删除&#xff0c;这样得到能发挥作用的趋势线的概率就…

Springboot 共享车位系统小程序-计算机毕设 附源码93439

Springboot 共享车位系统小程序 摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于springboot共享车位系统小程序。 对于本共享车位系统的设计来说&#xff0c;…

【深度学习驱动流体力学】剖析流体力学可视化paraview原理

目录 1.paraview版本2.配置过程检查插件库文件配置 ParaView 环境变量启动 ParaView 并检查插件3.可视化测试插件功能3.加载数据进行可视化第一步: 导入案例第二步:查看当前目录未更新前的内容第三步:使用 blockMesh 命令生成腔体案例的网格第四步:运行仿真icoFoam第五步:使用 …

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板&#xff0c;黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

E84-晶圆载具交接自动化

E84是一种通讯协议&#xff0c;它的核心作用在于为通讯传感器/设备的开发提供基础架构。 E84协议详细阐述了晶圆载具&#xff08;如FOUP/POD等&#xff09;在工厂自动化物料搬运系统&#xff08;AMHS&#xff09;与机台装载端口&#xff08;LP&#xff09;之间&#xff0c;如何…

X86+FPGA, NXP+FPGA:工控稳“固”之选 赋能CPCI/VPX智能轨交新变革

工业IPC在目前大时代背景下面临机遇,但挑战同样也不少。在轨道交通领域&#xff0c;工控机必须具备高可靠性和稳定性&#xff0c;能够在复杂且严苛的工作环境中长时间无故障运行&#xff1b;需要满足严格的实时性和响应性能要求&#xff0c;确保能够迅速准确地处理传感器信号和…

4K高质量视频素材库,剪辑必备

找免费4K 高质量视频素材&#xff0c;就上这8个网站&#xff0c;剪辑必备&#xff0c;赶紧收藏吧&#xff01; 1、baotu 【实拍视频】免费下载_实拍视频素材​ibaotu.com/shipin/7-5026-0-0-0-1.html?spmzhkolws​编辑 国内高质量素材网站&#xff0c;涵盖设计、新媒体、视频…

语言模型测试系列【10】

一个巧合&#xff0c;又测到了新的区别&#xff0c;以下是关于python代码生成的测试效果。 语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道商量智谱清言 这次的测试问题来源于**智谱AI开放平台**的介绍&#xff0c;正好有个python生成的效果说明…

qt 一个可以拖拽的矩形

1.概要 2.代码 2.1 mycotrl.h #ifndef MYCOTRL_H #define MYCOTRL_H#include <QWidget> #include <QMouseEvent>class MyCotrl: public QWidget {Q_OBJECT public://MyCotrl();MyCotrl(QWidget *parent nullptr); protected:void paintEvent(QPaintEvent *even…

Offset Explorer 连接SASL PLAIN鉴权的Kafka

1、填写Kafka信息 2、配置鉴权信息 Security 选择 SASL PLAINTEXT JAAS Config 配置账号密码 org.apache.kafka.common.security.plain.PlainLoginModule required username"账号"password"密码";