ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sa-Token 微服务依赖引入完全指南:网关与内部服务如何正确引入 Starter 与 Redis 集成包

Sa-Token 微服务依赖引入完全指南:网关与内部服务如何正确引入 Starter 与 Redis 集成包 Sa-Token 微服务依赖引入完全指南网关与内部服务如何正确引入 Starter 与 Redis 集成包【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token导读在微服务架构中引入 Sa-Token最常踩的坑往往不是鉴权逻辑本身而是依赖引入错误——网关误用 Servlet 版 Starter、内部服务误用 Reactor 版 Starter、甚至在同一项目里同时引入两个 Starter 导致项目无法启动。本篇以 sa-token-doc/micro/import-intro.md 为主线结合仓库中的 Starter 与插件源码系统梳理微服务场景下 Sa-Token 依赖的选型规则、Maven/Gradle 配置写法、SpringBoot 2/3/4 版本对应关系以及 Redis 同步包的引入方式帮助你在搭建微服务鉴权体系的第一步就做出正确选择。一、核心原则网关与内部服务分开引入依赖官方文档在「开始」章节虽已说明依赖引入规则但大量交流群中的 bug 最终都被排查为依赖引入错误。因此这里再强调一次微服务架构下的首要原则在微服务架构中使用 Sa-Token 时网关和内部服务要分开引入 Sa-Token 依赖不要直接在顶级父 pom 中引入 Sa-Token。原因很直观网关与内部服务的 Web 技术栈不同——内部服务通常基于 Servlet 模型SpringMVC而网关常常基于 Reactor 响应式模型SpringCloud Gateway、ShenYu 等。Sa-Token 为两种模型分别提供了独立的 Starter混用或共用一套依赖会导致上下文适配器冲突。从源码结构看这一设计在仓库中体现得非常清晰sa-token-starter目录下同时维护着 sa-token-spring-boot-starterServlet 模型与 sa-token-reactor-spring-boot-starterReactor 模型两套集成体系二者分别依赖不同的 Web 栈供不同场景独立使用。二、认识两个核心 Starter 依赖总体上微服务场景下需要关注的依赖就是两个sa-token-spring-boot-starter和sa-token-reactor-spring-boot-starter。2.1 sa-token-spring-boot-starterServlet 模型适用于基于 Servlet 的 SpringMVC/SpringBoot Web 应用。Maven 方式!-- Sa-Token 权限认证 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-spring-boot-starter/artifactId version${sa.top.version}/version /dependencyGradle 方式implementation cn.dev33:sa-token-spring-boot-starter:${sa.top.version}如果你使用的是SpringBoot 3.x请引入sa-token-spring-boot3-starter。如果你使用的是SpringBoot 4.x请引入sa-token-spring-boot4-starter。从 sa-token-spring-boot-starter/pom.xml 可以看出该 Starter 依赖了spring-boot-starter-web与sa-token-servlet这正是它面向 Servlet 容器Tomcat 等工作的底层依据。2.2 sa-token-reactor-spring-boot-starterReactor 模型适用于基于 Reactor 响应式模型的框架SpringCloud Gateway、ShenYu、WebFlux 等。Maven 方式!-- Sa-Token 权限认证Reactor响应式集成 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-reactor-spring-boot-starter/artifactId version${sa.top.version}/version /dependencyGradle 方式// Sa-Token 权限认证Reactor响应式集成 implementation cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}如果你使用的是SpringBoot 3.x请引入sa-token-reactor-spring-boot3-starter。如果你使用的是SpringBoot 4.x请引入sa-token-reactor-spring-boot4-starter。对照 sa-token-reactor-spring-boot-starter/pom.xml 可以发现该 Starter 依赖的是spring-web、reactor-core与sa-token-core并不包含sa-token-servlet与响应式 Web 栈严格对应。2.3 版本后缀的含义SpringBoot 2 / 3 / 4仓库中 sa-token-spring-boot3-starter/pom.xml 与 sa-token-spring-boot4-starter/pom.xml 清晰展示了版本分化sa-token-spring-boot3-starter编译目标为 Java 17maven.compiler.release17对应 SpringBoot 3.xJakarta EE、Jackson 2.xsa-token-spring-boot4-starter同样要求 Java 17但内部使用sa-token-jackson3对应 SpringBoot 4.xJackson 3不带数字后缀的sa-token-spring-boot-starter则对应 SpringBoot 2.xjavax 体系。Reactor 侧同理存在sa-token-reactor-spring-boot-starter、sa-token-reactor-spring-boot3-starter、sa-token-reactor-spring-boot4-starter三套见 sa-token-starter 目录结构。注意${sa.top.version}为占位符实际使用时请替换为当前项目依赖管理如父 pom 的revision或sa-token-bom中约定的 Sa-Token 版本号。三、如何判断该引入哪个 Starter选型的判断依据只有一个——你使用的基础框架是哪种 Web 模型服务类型基础框架示例应引入的 Starter内部基础服务SpringBoot SpringMVCServlet 模型sa-token-spring-boot-starterServlet 模型网关Zuul 等sa-token-spring-boot-starterReactor 模型网关SpringCloud Gateway、ShenYu、WebFlux 等sa-token-reactor-spring-boot-starter必须注册全局过滤器3.1 内部基础服务用 SpringMVCServlet 模型对于内部基础服务通常使用 SpringBoot 默认的 Web 模块 SpringMVC。由于 SpringMVC 基于Servlet 模型这里需要引入的是sa-token-spring-boot-starter。参考仓库中的官方示例sa-token-demo-springbootSpringBoot 2.x 集成示例见 sa-token-doc/start/example.md其启动类、Controller 直接通过StpUtil.login()/StpUtil.isLogin()完成登录与校验。3.2 网关服务分 Servlet 与 Reactor 两种情况网关大体分为两类基于 Servlet 模型的网关如 Zuul引入sa-token-spring-boot-starter。完整集成步骤参考 sa-token-doc/start/example.md。需要说明的是理论上 Zuul 并不支持 SpringBoot 3若使用 SpringBoot 3/4 请优先评估响应式网关方案。基于 Reactor 模型的网关如 SpringCloud Gateway、ShenYu 等引入sa-token-reactor-spring-boot-starter并且必须注册全局过滤器SaReactorFilter。完整集成步骤参考 sa-token-doc/start/webflux-example.md该文档明确写道WebFlux 常用于微服务网关架构中可以用同样的方式对接其它 Reactor 模型框架如 SpringCloud Gateway。3.3 红线严禁同时引入两个 Starter切不可直接在一个项目里同时引入这两个依赖否则会造成项目无法启动。这一点务必牢记Servlet 模型与 Reactor 模型的上下文适配器在同一容器中并存时会发生冲突导致启动失败。这也是「不要在顶级父 pom 统一引入」的根本原因——父 pom 引入后网关与内部服务会继承同一套依赖无法按模块差异化选择。3.4 为何 Reactor 网关必须注册全局过滤器Servlet 模型下Sa-Token 通过 servlet 过滤器SaServletFilter或拦截器自动拦截请求而响应式网关没有同步的 Filter 链路必须手动注册SaReactorFilter这个WebFilter才能完成鉴权。从 SaReactorFilter.java 源码可以看到它实现了WebFilter接口并通过Order(SaTokenConsts.ASSEMBLY_ORDER)设置默认优先级为 -100尽量保证在其它过滤器之前执行。它提供addInclude(...)拦截路由、addExclude(...)放行路由、setAuth(...)认证函数、setError(...)异常处理函数等链式 API。以 sa-token-doc/micro/gateway-auth.md 中的网关统一鉴权示例为例Reactor 网关中典型的过滤器注册方式如下/** * [Sa-Token 权限认证] 配置类 */ Configuration public class SaTokenConfigure { // 注册 Sa-Token全局过滤器 Bean public SaReactorFilter getSaReactorFilter() { return new SaReactorFilter() // 拦截地址 .addInclude(/**) /* 拦截全部path */ // 开放地址 .addExclude(/favicon.ico) // 鉴权方法每次访问进入 .setAuth(obj - { // 登录校验 -- 拦截所有路由并排除/user/doLogin 用于开放登录 SaRouter.match(/**, /user/doLogin, r - StpUtil.checkLogin()); // 权限认证 -- 不同模块, 校验不同权限 SaRouter.match(/user/**, r - StpUtil.checkPermission(user)); SaRouter.match(/admin/**, r - StpUtil.checkPermission(admin)); SaRouter.match(/goods/**, r - StpUtil.checkPermission(goods)); SaRouter.match(/orders/**, r - StpUtil.checkPermission(orders)); // 更多匹配 ... */ }) // 异常处理方法每次setAuth函数出现异常时进入 .setError(e - { return SaResult.error(e.getMessage()); }) ; } }配合StpInterface实现类提供权限/角色数据即可在网关处完成统一的登录校验与权限拦截详细的路由拦截匹配规则可继续阅读 sa-token-doc/use/route-check.md。四、Redis 集成包跨服务同步会话数据的关键在微服务架构中网关与各内部服务之间需要通过 Redis 同步数据token 会话、权限缓存等因此除了 Starter 之外还需要引入 Redis 集成包。4.1 依赖引入Maven / GradleMaven 方式!-- Sa-Token 整合 RedisTemplate -- dependency groupIdcn.dev33/groupId artifactIdsa-token-redis-template/artifactId version${sa.top.version}/version /dependency dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependencyGradle 方式// Sa-Token 整合 RedisTemplate implementation cn.dev33:sa-token-redis-template:${sa.top.version} implementation org.apache.commons:commons-pool2其中commons-pool2用于提供 Redis 连接池Lettuce 连接池依赖它。详细配置连接地址、密码、连接池参数等参考 sa-token-doc/up/integ-redis.md。4.2 为什么是 RedisTemplate 方案sa-token-redis-template/pom.xml 显示该插件依赖spring-boot-starter-data-redis是 SpringBoot 官方推荐的 Redis 客户端方案。其核心实现 SaTokenDaoForRedisTemplate.java 实现了SaTokenDao接口内部基于StringRedisTemplate完成 token、Session 等数据的读写与过期管理。引入后Sa-Token 默认的数据存储层会从内存实现自动切换为 Redis 实现从而满足两个微服务关键需求重启数据不丢失内存模式下服务重启后登录态全部丢失Redis 模式下数据持久化在缓存中间件中多节点会话一致网关与多个内部服务共享同一个 Redis任意节点写入的登录态可被其它节点读取这是分布式/微服务场景下会话同步的基础。4.3 注意事项与扩展方案若往 Session 中存入自定义实体类后从 Redis 读回报错「无法反序列化的类型xxx请先将其注册到 JSON 全局类型白名单」请参考 sa-token-doc/plugin/json-extend.md 中的 JSON 全局类型白名单机制。若 Redis 服务版本低于 6.0集成可能报ERR syntax error涉及SET KEEPTTL特性可参考 sa-token-doc/more/common-questions.md 中的相关说明。Redis 的集成方式不止一种Sa-Token 还提供了 sa-token-alone-redis、sa-token-redisson、sa-token-caffeine 等多种缓存扩展实现深入探究可阅读 sa-token-doc/plugin/dao-extend.md。五、实践清单微服务项目依赖落地步骤将上述规则落地的推荐步骤如下父 pom 只做依赖版本管理在顶级父 pom 中使用dependencyManagement管理 Sa-Token 各依赖的版本本仓库通过sa-token-bom与sa-token-dependencies统一维护不要直接声明 Sa-Token 依赖避免网关与内部服务继承到错误的 Starter。内部服务模块在子模块 pom 中引入sa-token-spring-boot-starterSpringBoot 2.x或sa-token-spring-boot3-starter/sa-token-spring-boot4-starter3.x / 4.x并引入sa-token-redis-templatecommons-pool2。网关模块在网关 pom 中引入sa-token-reactor-spring-boot-starter或 3/4 后缀版本 Redis 包并额外注册SaReactorFilter全局过滤器完成统一鉴权。自查依赖树确认任一模块的依赖树中不包含同时出现的sa-token-servlet与 reactor 上下文适配器这是「两个 Starter 冲突」的直接信号。仓库中提供了可直接对照的完整示例网关/响应式场景可参考 sa-token-demo-webflux对应 sa-token-doc/start/webflux-example.mdSpringBoot 2.x 场景可参考 sa-token-demo-springboot需要 Redis 共享会话的可参考 sa-token-demo-springboot-redis均位于 sa-token-demo 目录下。结语微服务架构下的 Sa-Token 依赖引入本质上是「Web 模型」与「版本体系」的二元选择题Servlet 模型用sa-token-spring-boot-starterReactor 模型用sa-token-reactor-spring-boot-starterSpringBoot 2/3/4 分别对应无后缀/3/4 后缀同时保持「父 pom 不引入、模块按需引入」的习惯并统一通过 Redis 包打通跨服务会话数据。只要守住这几条规则就能避免绝大多数因依赖引入错误而引发的「项目无法启动」「鉴权不生效」类问题让微服务鉴权体系稳定落地。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表