SpringCloud - Token校验失效

本文探讨了在微服务架构中,由于JWT Token在公共模块中使用不同密钥导致ucenter和goods模块校验失效的问题。解决办法是确保每个模块拥有独立的数字+字母组合的密钥,并在编译时将common类方法私有化。关键在于理解密钥管理在微服务中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

  • 在微服务工程中,JwtToken作为common工程下的公共模块,同时被goods8011和ucenter8081服务调用,
    在使用ucenter模块登陆后生成的token可以在ucenter模块校验成功,但是goods模块校验token失败

无法校验token

  • 使用生成的token在ucenter模块中是可以校验并成功解析
  • 但是在goods模块中无法解析token

解决

原因
  • 在JwtToken生成的工具类中加密/解密密钥使用了UUID,在两个模块校验token的时候使用的是两个不相同的密钥解密

  • ucenter模块输出的密钥

  • goods模块输出的密钥

使用一串固定的密钥即可

注意

注意: 密钥生成只能是数字和字母组合(不能纯数字、纯字母或者含有特殊符号

总结

  • 密钥为数字 + 字母组合(可以不同,但区别不能过大)
  • 每个模块编译common中的类方法为自己源文件,各模块的密钥不是相等的。
### 集成 sa-tokenSpring Cloud 项目中的方法 为了实现分布式会话管理和权限控制,可以按照以下方式配置 `sa-token` 并将其集成到 Spring Cloud 项目中。 #### 添加依赖 在项目的 `pom.xml` 文件中引入必要的依赖项。以下是推荐的依赖版本: ```xml <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.38.0</version> </dependency> ``` 此依赖提供了与 Spring Boot 的无缝集成支持[^2]。 --- #### 配置 sa-token 属性 在 `application.yml` 或 `application.properties` 文件中定义 sa-token 的基础属性。例如: ```yaml sa-token: token-name: satoken # 自定义 Token 名称,默认为 "satoken" timeout: 2592000 # token有效期,单位s,默认30天 is-concurrent: true # 是否开启允许多处登录 kickout-rule: LRU # 被踢下线策略:LRU(最近最少使用) / FIFO(先进先出) max-kickout: 5 # 同一账号最大并发数 (is-concurrent=true时有效),默认不限制 ``` 这些配置能够满足大多数场景下的需求,并允许开发者自定义行为[^1]。 --- #### 初始化 StpUtil 工具类 通过静态工具类 `StpUtil` 可以快速操作用户的登录状态和令牌信息。例如,在用户成功登录后调用以下代码生成并返回 Token: ```java import cn.dev33.satoken.stp.StpUtil; public String login(String username, String password) { // 假设验证逻辑已通过 StpUtil.login(username); // 登录指定账户id return StpUtil.getTokenValue(); // 获取当前账户的Token值 } ``` 上述代码片段展示了如何创建一个新的会话以及获取对应的 Token 值。 --- #### 分布式环境的支持 对于多服务架构而言,确保各微服务间共享同一份 Redis 数据存储至关重要。因此需额外增加如下配置来启用基于 Redis 的持久化机制: ```properties spring.redis.host=localhost spring.redis.port=6379 sa-token.is-share=true # 开启跨应用共享功能 sa-token.cache-type=redis # 设置缓存类型为Redis模式 ``` 当设置好以上参数之后,所有的节点都会同步访问同一个 Redis 实例来进行数据交换。 --- #### 定义拦截器进行全局校验 可以通过 AOP 方面或者 WebFlux Filter 对请求路径做统一处理,从而达到自动检验身份的效果。下面是一个简单的例子展示如何利用注解形式完成资源保护工作: ```java @RestController @RequestMapping("/api/user") @SaCheckLogin // 表明该接口需要登录才能访问 public class UserController { @GetMapping("/{id}") public ResponseEntity<UserDto> getUserById(@PathVariable Long id){ UserDto user = userService.findById(id); return new ResponseEntity<>(user , HttpStatus.OK ); } } ``` 这里我们运用了 `@SaCheckLogin` 注解标记整个控制器都需要经过认证才可以被调用。 --- #### 测试学习建议 如果实际开发过程中碰到困难,则可以直接参照官方提供的 demo 示例工程 `/sa-token-demo/sa-token-demo-webflux` 进行调试研究。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanlin-hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值