多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

《API网关》第7章:权限认证组件(Shiro + JWT)设计与实现解析

《API网关》第7章:权限认证组件(Shiro + JWT)设计与实现解析 《API网关》第7章权限认证组件Shiro JWT设计与实现解析【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址: https://gitcode.com/gh_mirrors/code/CodeGuide本文以仓库文档 《API网关》第7章权限认证组件(ShiroJwt) 为骨架结合《API网关》系列文档中的架构设计与后续章节实现系统讲解在自研 API 网关中如何引入 Shiro JWT 构建统一鉴权能力为什么要做权限校验、Shiro JWT 的整合思路、模块边界设计与单元测试之间的关系以及它与第8章网关会话鉴权处理的衔接方式。读完本文你将掌握网关场景下 Token 鉴权的设计套路并理解先独立组件、后编入流程的工程化落地方法。一、学习指引为什么你的工程做不到单元测试在进入权限认证组件之前第7章先抛出了一个非常值得思考的问题为什么你的工程做不到单元测试单元测试unit testing是指对软件中的最小可测试单元进行检查和验证。但在实际开发中大部分情况下我们并没有做单元测试做的只是为了验证某个功能点而启动一整条功能链路的功能测试。之所以出现这种情况根本原因在于系统功能的设计和开发中没有对功能节点进行拆分使很多流程的边界不清晰。例如把某一功能点直接编写在业务流程中当这一块功能点出问题时你没法独立测试它只能启动整个链路的功能并传入一些与核心模块无关的参数信息。因此在做功能设计和实现时要注意这些模块的边界让它们尽可能先保持独立运行之后依照设计原则编入整个流程中去。这样才能真正满足单元测试否则你做的只是整块的、大的流程验证而已。这条方法论正是本章权限认证组件的设计准则——Shiro JWT 的鉴权能力被封装为独立组件先单独可测再在后续章节第8章编入 Netty 通信管道流程。二、为什么网关需要权限认证在仓库 API网关架构设计总览 中可以看到整套网关的核心模型API 网关算力以多套服务注册到网关中心拉取 RPC 应用接口并完成 HTTP 映射调用最终允许用户通过 Nginx 负载均衡访问网关算力由网关执行协议解析和 RPC 泛化调用并返回结果。在这套链路中网关扮演着外部 HTTP 请求与内部 RPC 服务之间的流量入口承载协议转换、参数校验、鉴权、切量、熔断、限流、监控、风控等共性通用服务见 开篇文档 中的架构设计。其中鉴权是必不可少的一环。第7章明确给出了设计动机在我们实现的 API 网关中当接收 HTTP 请求以后开始调用对应的 RPC 接口前其实还应该做一步权限验证。也就是说你当前调用的 HTTP 接口是否含带了我授予的 Token 信息这个 Token 是否在有效期范围等控制这样才能保证一个 HTTP 的调用和返回结果是安全可靠的。也就是说网关鉴权需要解决两个核心问题校验点说明Token 是否存在当前 HTTP 调用是否携带了网关授予的 Token 信息Token 是否有效Token 是否在有效期内、签名是否合法只有这两项都通过请求才被放行去调用对应的 RPC 接口从而保证 HTTP 调用与返回结果的安全可靠。三、权限校验设计Shiro JWT 的整合思路1. 整体设计关于网关中权限的校验会使用到Shiro Jwt同时还要提供单独的 Handler 来处理 Netty 通信中对信息的校验处理。这里需要注意的是这部分内容天然划分为两块功能Shiro JWT 鉴权组件提供认证服务负责 Token 的签发与校验能力Netty 通信管道中的鉴权 Handler负责在网络请求处理流程中实际执行鉴权操作。由于这两块属于不同的功能域第7章只先完成 Shiro Jwt 部分为后续章节在网络通信中验证 Token 信息做准备。这种先组件、后集成的拆分方式正是第一节中模块边界 独立单元测试方法论的实际应用。2. 为什么选择 Shiro 而不是 Spring SecurityApache Shiro 是 Java 的一个安全框架。目前使用 Apache Shiro 的人越来越多因为它相当简单。对比于 Spring SecurityShiro 可能没有其功能强大但在实际工作中并不需要那么复杂的东西所以使用小而简单的 Shiro 就足够了。这一选择与网关节点的定位高度契合网关核心职责是协议转换与请求转发鉴权只是其中的一个共性服务点不需要 Spring Security 那样完整的企业级认证授权体系如过滤器链、方法级安全等一个轻量的 Shiro JWT 组合即可覆盖Token 校验这一核心诉求。3. Shiro JWT 在仓库其他项目中的同源实践本仓库的 ChatGPT 微服务应用体系《第2节Shiro登录授权发放访问token》 记录了同一作者在另一个项目中完整的 Shiro JWT 落地代码可以作为理解网关鉴权组件实现方式的同源参考该项目的核心技术栈同样包含 SHIRO、JWT见 《API网关》notes 面试汇总。其核心流程为用户访问登录接口 → 服务端用账号密码验证 → 验证通过后发放 Token → 之后使用 Token 访问受保护接口。典型的登录签发 Token 代码如下// 登录验证 authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(userName, password)); // 验证通过获取 token String token JWT.create() .setExpiresAt(new Date(System.currentTimeMillis() (1000 * 30))) .setPayload(username, userName) .setKey(key.getBytes(StandardCharsets.UTF_8)) .sign(); return token;典型的 Token 校验代码如下String authToken authHeader.split( )[1]; // 校验 Token 签名与有效期 if (!JWTUtil.verify(authToken, key.getBytes(StandardCharsets.UTF_8))) { filterChain.doFilter(request, response); return; } // 解析 Token 中的用户身份 final String userName (String) JWTUtil.parseToken(authToken).getPayload(username);可以看到该组合的要点JWT 负责无状态凭证签发时设置过期时间setExpiresAt与自定义载荷setPayload如用户名通过共享密钥setKey签名Shiro 负责认证框架提供登录验证、Subject 会话等安全抽象与 JWT 组合实现登录发证、持证访问的闭环鉴权时校验两件事用JWTUtil.verify校验签名与有效期用parseToken取出身份信息。网关中的 Shiro JWT 组件按同样的思想设计签发 Token 的能力服务于授予调用方访问权限校验 Token 的能力服务于HTTP 请求到达 RPC 调用前的准入检查。四、模块边界组件独立可测再编入流程回到第一节提出的为什么工程做不到单元测试的问题第7章给出的解法是拆分功能节点把鉴权从业务处理流程中抽离形成独立组件独立运行验证组件先脱离主流程单独开发、单独测试依设计原则编入流程验证通过后再以 Handler 的形式挂载到 Netty 通信管道中。这套思路也体现在整个 API 网关系列的渐进式迭代中——每一章只新增一个清晰的功能模块从 第1章HTTP请求会话协议处理 到 第6章引入执行器封装服务调用每个模块边界清晰、可独立验证最终组合成完整的网关引擎。五、与第8章的衔接网关会话鉴权处理第7章完成的 Shiro JWT 组件正是为第8章网关会话鉴权处理做的铺垫。在 第8章文档 中一次网络请求经过 Netty 处理被明确拆分为三段消息接收 → 请求鉴权 → 消息处理在原来接收消息后直接把消息协议转换并请求到 RPC 服务的单一处理之上增加了请求鉴权这一层而请求鉴权正是基于第7章引入的 Shiro JWT 完成。为满足消息的处理和鉴权第8章引入了 2 个新的 Netty 消息处理 Handler并对原有 Handler 做了职责收敛Handler类型职责AuthorizationHandler新增做接口的鉴权即基于 Shiro JWT 校验 TokenProtocolDataHandler新增做协议数据的处理GatewayServerHandler修改作为第一个 Netty 通信管道处理类只做简单参数解析保存到管道中后放行后续再有一些需要优先处理的逻辑也会放到GatewayServerHandler中完成。这样一次 HTTP 请求在网关内的处理路径就变为GatewayServerHandler接收消息、解析参数并放行AuthorizationHandler基于 Shiro JWT 校验请求携带的 Token是否存在、是否在有效期鉴权通过后由ProtocolDataHandler处理协议数据进而泛化调用 RPC 服务。至此第7章的权限认证组件与第8章的会话鉴权处理完成了闭环组件提供鉴权能力Handler 将能力接入网络通信流程。这也印证了本章的核心方法论——先让模块独立运行再依照设计原则编入整个流程。六、小结本章作为《API网关》系列中通信组件部分的收尾章节第7章核心价值有三点明确网关鉴权的必要性HTTP 请求到达 RPC 调用之前必须校验 Token 的存在性与有效性保证调用安全确定技术选型采用小而简单的 Shiro JWT 组合提供认证服务组件先行、独立可测避免将鉴权逻辑硬编码进业务链路为会话鉴权铺路本章只完成 Shiro JWT 组件部分真正的 Handler 集成AuthorizationHandler、ProtocolDataHandler留待第8章完成体现先独立组件、后编入流程的工程化节奏。如果你正面临系统没有单元测试、功能无法独立验证的困境不妨像本章一样从拆分模块边界开始如果你正在设计网关或统一入口的鉴权能力Shiro JWT 这套轻量认证组件 管道内鉴权 Handler的组合是一个经过实战检验的参考方案。【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址: https://gitcode.com/gh_mirrors/code/CodeGuide创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表