【Sa-Token|2】Sa-Token在微服务中的使用

在微服务架构中,使用 Sa-Token 进行分布式认证和权限管理需要考虑到各个服务之间的通信和 Token
的共享。以下是一个详细的教程,介绍如何在微服务中使用 Sa-Token。

1. 微服务架构介绍

假设有以下几个微服务:

  • AuthService: 负责用户认证和 Token 生成。
  • UserService: 负责用户信息管理。
  • OrderService: 负责订单管理。

2. 引入依赖

在每个微服务中引入 Sa-Token 的依赖。以 Maven 项目为例,可以在每个服务的 pom.xml 文件中添加以下依赖:

<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.31.0</version>
</dependency>

3. 配置 Sa-Token

在每个微服务中配置 Sa-Token。在 application.ymlapplication.properties 文件中添加配置。例如:

sa-token:token-name: satokentimeout: 86400activity-timeout: -1is-read-cookie: trueis-log: falseis-splicing: false

4. AuthService 实现

AuthService 负责用户的认证和 Token 生成。

AuthController
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password) {// 假设这是从数据库中查找的用户信息if ("admin".equals(username) && "123456".equals(password)) {StpUtil.login(10001);return "登录成功,Token: " + StpUtil.getTokenValue();}return "登录失败";}@PostMapping("/logout")public String logout() {StpUtil.logout();return "注销成功";}
}

5. 其他微服务的配置

其他微服务(如 UserService 和 OrderService)需要在请求中携带 Token 并进行验证。

配置全局拦截器

在每个微服务中配置全局拦截器以验证 Token。

import cn.dev33.satoken.interceptor.SaInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class SaTokenConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**").excludePathPatterns("/auth/login", "/auth/logout");}
}
UserController 示例
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/info")public String getUserInfo() {StpUtil.checkLogin(); // 检查是否登录int userId = StpUtil.getLoginIdAsInt();// 根据 userId 获取用户信息(省略具体逻辑)return "用户信息";}
}
OrderController 示例
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/order")
public class OrderController {@GetMapping("/list")public String getOrderList() {StpUtil.checkLogin(); // 检查是否登录int userId = StpUtil.getLoginIdAsInt();// 根据 userId 获取订单列表(省略具体逻辑)return "订单列表";}
}

6. 微服务之间的调用

在微服务之间调用时,需要在请求头中携带 Token。可以使用 Feign Client 进行服务间调用。

Feign 配置

添加 Feign Client 依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建 Feign Client

例如,在 UserService 中调用 OrderService:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;@FeignClient(name = "order-service")
public interface OrderServiceClient {@GetMapping("/order/list")String getOrderList(@RequestHeader("satoken") String token);
}
在控制器中使用 Feign Client
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate OrderServiceClient orderServiceClient;@GetMapping("/orders")public String getUserOrders() {StpUtil.checkLogin(); // 检查是否登录String token = StpUtil.getTokenValue();return orderServiceClient.getOrderList(token);}
}

7. 集成 Redis 实现分布式会话

为了在分布式系统中共享 Token,可以使用 Redis 存储会话信息。

引入 Redis 依赖

pom.xml 文件中添加 Redis 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置 Redis

application.yml 中配置 Redis 连接信息:

spring:redis:host: localhostport: 6379
启用 Redis 存储

在 Sa-Token 配置类中启用 Redis 存储:

import cn.dev33.satoken.dao.SaTokenDaoRedis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;@Configuration
public class SaTokenConfig {@Beanpublic SaTokenDaoRedis saTokenDaoRedis(RedisConnectionFactory connectionFactory) {return new SaTokenDaoRedis(connectionFactory);}
}

8. 完整示例

以下是一个包含登录、注销、权限验证和微服务间调用的完整示例:

AuthService
@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password) {if ("admin".equals(username) && "123456".equals(password)) {StpUtil.login(10001);return "登录成功,Token: " + StpUtil.getTokenValue();}return "登录失败";}@PostMapping("/logout")public String logout() {StpUtil.logout();return "注销成功";}
}
UserService
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate OrderServiceClient orderServiceClient;@GetMapping("/info")public String getUserInfo() {StpUtil.checkLogin();return "用户信息";}@GetMapping("/orders")public String getUserOrders() {StpUtil.checkLogin();String token = StpUtil.getTokenValue();return orderServiceClient.getOrderList(token);}
}@FeignClient(name = "order-service")
public interface OrderServiceClient {@GetMapping("/order/list")String getOrderList(@RequestHeader("satoken") String token);
}
OrderService
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/order")
public class OrderController {@GetMapping("/list")public String getOrderList(@RequestHeader("satoken") String token) {StpUtil.checkLogin(); // 检查是否登录return "订单列表";}
}

通过以上步骤,你已经完成了在微服务架构中使用 Sa-Token 进行分布式认证和权限管理的基本配置。你可以根据具体需求进行扩展和调整。

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

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

相关文章

Python-日志模块

目录 一、日志级别 二、日志配置 1、日志基本配置 2、日志配置字典&#xff08;知道咋么改就可以&#xff09; 3、日志的使用 一、日志级别 import logginglogging.debug(调试日志) logging.info(消息日志) logging.warning(警告日志) logging.error(错误日志) logging.cr…

Java自增自减运算符

Java中的自增自减运算符分为两种&#xff1a; 自增运算符“ ”&#xff0c;作用是执行加法运算的变量值1 自减运算符“ -- ”&#xff0c;作用是执行加法运算的变量值-1 注意事项&#xff1a; “ ”和“ -- ”既可以放在变量的前面&#xff0c;也可以放在变量的后面。 自增自…

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…

大模型自然语言生成自动驾驶可编辑仿真场景(其一 共十篇)

第一篇&#xff1a;LLM greater scene summarize 第二篇&#xff1a;LLM simulation Test effect 第三篇&#xff1a;LLM simulation driving scenario flow work 第四篇&#xff1a;LLM Algorithm flow description 第五篇&#xff1a;Configure the environment and back…

每天一个项目管理概念之PDCA

在项目管理中&#xff0c;PDCA&#xff08;计划-执行-检查-行动&#xff09;循环是一种广泛采用的质量管理工具&#xff0c;它帮助组织确保项目能够高效、有序地进行&#xff0c;并持续优化流程。本文将深入探讨PDCA循环的四个阶段&#xff0c;以及如何将其应用于项目管理中&am…

一键转换PDL至HTML,轻松驾驭文档格式,高效办公新纪元从此开启!

在信息爆炸的时代&#xff0c;文档格式繁多&#xff0c;如何高效处理这些文档成为了每个职场人士关注的焦点。现在&#xff0c;我们为您带来一款革命性的工具——一键转换PDL至HTML&#xff0c;让您轻松驾驭文档格式&#xff0c;开启高效办公新纪元&#xff01; 首先&#xff0…

八-工具包3-pandas数据清洗及相关性

数据清洗概述 数据清洗是对一些没有用的、不合理的数据进行处理的过程。 很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。 样本数据: from io import StringIO import pandas as pdcsv_d…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造

14模型构造 import torch from torch import nn from torch.nn import functional as F#通过实例化nn.Sequential来构建我们的模型&#xff0c; 层的执行顺序是作为参数传递的 net1 nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256,10)) """ nn.…

不同@Transactional方法调用同一个synchronized方法引发的生成重复序号问题

背景&#xff1a; Transactional( propagation Propagation.REQUIRED ) 方法 A内调用synchronized方法 这种默认传播方式使得子函数也加入当前事务&#xff0c; synchronized方法结束之后&#xff0c; Transactional 方法A 执行结束之前, synchronized方法对数据库表所作变…

Electron快速入门(三):在(二)的基础上修改了一个文件夹做了个备忘录

Lingering Memories 诗绪萦怀 修改index.html <!--index.html--> <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --><meta http…

opencv-python(十一)

图像加法 import numpy as np import cv2 img cv2.imread(jk.jpg) res cv2.add(img, img) cv2.imshow(Mypicture1,img) cv2.imshow(MyPicture2,res)cv2.waitKey(0) cv2.destroyAllWindows() res cv2.add(src1, src2, dstNone, maskNone, dtypeNone) src1&#xff1a;第一幅…

Android RecyclerView卡顿

Android RecyclerView卡顿的原因可能包括以下几点&#xff1a; 数据加载和渲染耗时&#xff1a; 当列表项较多或者数据量庞大时&#xff0c;如果在主线程中进行数据加载和布局渲染&#xff0c;会导致主线程阻塞&#xff0c;从而造成滑动卡顿。例如&#xff0c;在滚动过程中需要…

作为一名程序员,怎么才能写出简洁实用还漂亮的代码楼呢?这25个超惊艳的Python代码写法,你一定要学会!

前言 Python可以用于复杂的数据分析和Web开发项目&#xff0c;还能以极少的代码行数完成令人惊叹的任务。本文将分享25个简短的Python代码示例&#xff0c;用来展示Python编程语言的魅力和效率。 1.列表推导式 Python的列表推导式提供了一种优雅的方法来创建列表。 # 将一个…

以太坊==MetaMask获取测试币最新网址

估算分数https://community.infura.io/t/unable-to-receive-sepolia-eth-from-faucet/7715 Gitcoin Passport 水龙头地址&#xff0c;填入自己的测试地址 水龙头项目地址 GitHub - pk910/PoWFaucet: Modularized faucet for EVM chains with different protection methods (…

从0开发一个Chrome插件:用户反馈与更新 Chrome 插件

前言 这是《从0开发一个Chrome插件》系列的第二十二篇文章,也是最终篇,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发…

2023年JCR影响因子正式发布,点击查看能源与燃料领域期刊变化【持续更新02】

2024年6月20日&#xff0c;科睿唯安发布了2024年度《期刊引证报告》(Journal Citation Reports&#xff0c;JCR)&#xff0c;报告覆盖全面的高质量期刊资源&#xff0c;提供了丰富的数据、指标和分析。今年JCR的最大变化为&#xff1a;把属于不同数据库&#xff0c;但属于同一学…

学习笔记:(3)荔枝派Nano在lvgl下使用矢量字体显示中文(全志F1C200S))

荔枝派Nano在lvgl下使用矢量字体显示中文 1.软件版本要求2.在buildroot下编译freetype三级目录 1.软件版本要求 buildroot 2023.05.xFreeType 2.13.1lvgl v8.3.9lv_drivers v9.0.0-dev 2.在buildroot下编译freetype 三级目录

Linux ComfyUI安装使用;Stable Diffusion 3使用

1、Linux ComfyUI安装使用 参考: https://zhuanlan.zhihu.com/p/689021495 安装步骤: ## 1、下载ComfyUI git clone https://github.com/comfyanonymous/ComfyUI ## 2、进入ComfyUI,安装依赖包 cd ComfyUI pip install -r requirements.txt ## 3\安装插件 cd custom_nodes…

FEC 向前纠错编码

随写&#xff0c;看的有点杂&#xff0c;简单记一下。 应该叫ReedSolomon FEC RS算法简单来讲就是&#xff0c;根据已有数据&#xff0c;构造模型&#xff0c;然后根据模型判纠错&#xff1f; 简单来讲&#xff0c;两点确定一条直线&#xff0c;直线直线上的点都会满足 y kx…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-18GPU

18GPU import torch from torch import nn#使用CPU torch.device(cpu)#使用GPU #cuda:0和cuda是等价的 #是一个上下文管理器&#xff0c;用于在其上下文范围内临时设置默认CUDA设备 torch.cuda.device(cuda)#如果有多个GPU,torch.device(fcuda:{i}),表示使用第i块GPU&#xff…