企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 一、网关认证件鉴权流程 目前主流的结合微服务网关及JWT令牌开发用户认证及服务访问鉴权的流程如下: ![](https://img.kancloud.cn/e8/bf/e8bf7ac09fc8fdc5c53052550550c626_653x554.png) * 用户认证流程:用户向网关发送登录认证请求,网关将请求转发给认证服务。认证服务校验用户登录信息(用户密码、短信及图片验证码)等信息之后,如果校验成功颁发一个token令牌给该用户(这个令牌可以是JWT令牌) * 网关级别访问鉴权:当用户访问系统内的其他业务服务接口时,需要携带登录认证的时候颁发的JWT token。网关验证JWT token的合法性,如果token不合法,则返回接口访问权限不足。如果token合法,则将请求按照网关的路由规则转发至相应的服务。 * 服务级别访问鉴权:网关级别的访问鉴权只是鉴别了JWT令牌的合法性,初步认定你是这个系统的用户,但是作为系统的用户并不意味着你可以访问所有的服务接口。通常基于用户的角色分类有更严格的访问权限划分。 > 令牌的颁发和校验需要基于同一个密钥,也就是说JWT 令牌的签名和解签必须有同一个密钥。谜面是"天王盖地虎",谜底必须是“宝塔镇河妖”,如果密钥对不上则令牌的校验失败。 所以通常网关层面除了转发请求之外需要做两件事:一是校验JWT令牌的合法性,二是**从JWT令牌中解析出用户身份,并在转发请求时携带用户身份信息。这样系统内的其他业务服务在收到转发请求的时候,根据用户的身份信息判断决定该用户可以访问哪些接口。** ## 二、流程优化方案 从上面的流程中我们可以看出 * 令牌的颁发是由认证服务完成的 * 令牌的校验是由网关完成的 也就是说这个JWT密钥相关的基础配置必须得在“认证服务”和“网关服务”上都配置一份,这样的配置分散不利于维护和密钥管理。所以我们优化一下流程:在gateway服务网关的服务上开发登录认证功能。优化后的流程如下: ![](https://img.kancloud.cn/29/5b/295b699eaa9dc53c80bb7f0a9346c3c6_591x470.png) ## 三、学习本章内容需要具备的基础知识 从上面的流程看出,实现JWT认证鉴权流程其实并不是很复杂,但是要想真正的做好服务接口的鉴权流程,其涉及的基础知识还是非常多的。 ### 3.1.在网关上实现登录认证 * 因为gateway网关的基础框架是Spring WebFlux,不是Spring MVC。所以你需要有一定的WebFlux开发知识。 * Spring WebFlux对于关系型数据库的响应式编程目前的支持非常有限。笔者多次试验mybatis目前肯定是不能用了,JPA兼容性比较好。所以你要有JPA的知识。(WebFlux不支持MysQL数据库访问的响应式编程,不等于它不支持MySQL,还是可以使用MYSQL数据库的) ### 3.2. Spring Security基础 系统内的其他业务服务在收到转发请求的时候,根据用户的身份信息判断决定该用户可以访问哪些接口。该如何实现?你要有Spring Security的基础知识及RBAC权限管理模型相关的基础知识。 * * * 以上的基础内容还是非常庞大的,任何一项都可以专门写一本书来介绍。**如果你学习本章的内容有困难,需要你先去补基础知识!**可以去网上找资料学习,也可以参考笔者的另外2个作品: * 后端基础Spring Boot:[手摸手教你学Spring Boot2.0](https://www.kancloud.cn/hanxt/springboot2/content) * 权限管理:[Spring Security-JWT-OAuth2一本通](https://www.kancloud.cn/hanxt/springsecurity/content) ## 附录--上面的时序图代码 在线时序图编辑工具:[https://www.websequencediagrams.com/](https://www.websequencediagrams.com/) ~~~ 用户->+网关: 登录请求 网关-->-用户: return token 用户->+网关: 携带token访问业务 网关->网关: 校验token的合法性 网关->+其他服务: 携带用户身份信息转发请求 其他服务-->-网关: return data 网关-->-用户: return data ~~~