• Spring Cloud Gateway整合OAuth2思路分享


    f3196abc8281f46ce52af28ecb438d1f.gif

    微服务做用户认证和授权一直都是一个难点,随着OAuth2.0的密码模式被作废,更是难上加难了。今天胖哥群里的一个群友搭建用户认证授权体系的时候遇到了一些棘手的问题,这让胖哥觉得是时候分享一些思路出来了。

    两种思路

    通常微服务的认证和授权思路有两种:

    • 所有的认证授权都由一个独立的用户认证授权服务器负责,它只负责发放Token,然后网关只负责转发请求到各个微服务模块,由微服务各个模块自行对Token进行校验处理。

    • 另一种是网关不但承担了流量转发作用,还承担认证授权流程,当前请求的认证信息由网关中继给下游服务器。

    第一种非常简单,而且我在多个微服务项目中都是这样设计的。如果你从来没有设计过,我其实建议按这个思路去做,你只需要搞一个负责管理用户、角色权限的服务器,其它的微服务模块都作为资源服务器自行和这个用户授权服务器进行交互,加上三户模型体系就足以应对各种场景了。

    0786305bdb01bbbdcd93cad9c0130129.png

    第二种结合了OAuth2体系,网关不仅仅承担流量转发功能,认证授权也是在网关层处理的,令牌会中继给下游服务。这种模式下需要搭建一个UAA(User Account And Authentication)服务。它非常灵活,它可以管理用户,也可以让受信任的客户端自己管理用户,它只负责对客户端进行认证(区别于用户认证)和对客户端进行授权。目前使用OAuth2对微服务进行安全体系建设的都使用这种方式。

    44292b537f93ec5c3db3c873b181f731.png

    接下来分享一下我在第二种思路上的成果。

    Spring Cloud Gateway 结合OAuth2提供UAA服务

    用的技术有:

    • Spring Cloud Gateway

    • Spring Authorization Server

    • Spring Security 5.0 OAuth2 Client

    • OIDC 1.0

    大致的思路

    UAA服务器自然由 Spring Authorization Server承担。它负责整个用户的管理,当然你还可以分离一个专门的用户服务器,只不过UAA需要通过Spring Cloud OpenFeign和用户服务通信;另外它还是一个OAuth2授权服务器,管理OAuth2客户端,处理OAuth2授权。重点来了,网关Gateway需要作为OAuth2客户端注册到UAA服务器,并作为一个OAuth2客户端。

    257fa1b763586808a25f61322b8c179e.png

    微服务应用

    User Agent(浏览器、APP)通过网关请求资源时:

    75633c61b966ca3acefb10e503b24f79.png

    上面执行的是一个标准的OAuth2授权码流程,Spring Cloud Gateway会把用户引导到UAA服务器的登录接口去登录。

    9abb388e6f98bee77e13db62724c4c3e.png

    终端用户登录后进行授权确认,注意看F12的链路

    9df024af68f9b34ebf4eb83d103d44ed.png

    用户确认

    用户勾选授权并确认后,成功访问到了资源,同样看调用的链路。

    18d374470df29beb5f477cdb0c1fdd5e.png

    成功访问资源

    授权确认提交后,再次重定向到OAuth2授权码登录流程,最终获取了资源。

    我们看最终/res/foo的请求细节,居然没有携带Token也拿到了用户的所有权限。

    41428107b70f23e612cd5646a340b325.png

    这都是网关令牌中继的功劳,前端应用很好地屏蔽了JWT令牌。

    如果有多个Gateway节点和UAA节点,可能要结合Spring Session去实现分布式Session以及对一些客户端信息、用户信息进行分布式管理。

    总结

    通过上面流程的介绍,动手能力很强的小伙伴应该能实现相关的功能了。我正在总结归纳相关的知识点,基于某些原因胖哥现在还没办法给出具体的DEMO,不过这些都会在我的OAuth2专栏进行详细讲解,如果你想掌握这些高精尖的技术,就关注一下我。另外你也可以点击阅读原文直达专栏。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【IR】Vision-Language Tracking
    【吴恩达机器学习-笔记整理】设计复杂的机器学习系统(执行的优先级,误差分析,不对称性误差评估,精确度和召回率)
    【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?
    高级二-十进制转换算法
    为诚的Python学习笔记(基本语法)
    String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的?
    杭电多校七 1003-Counting Stickmen(组合数学)
    如何实现上拉加载,下拉刷新?
    VBA数据库解决方案第九讲:把数据库的内容在工作表中显示
    iOS上架App Store的全攻略
  • 原文地址:https://blog.csdn.net/asdfadafd/article/details/126114129