旧的Spring Security OAuth2进行保护曾经有一段时间了,99%Spring Cloud微服务项目还在应用这些旧的体系,重大青黄不接。很多同学都在寻找新的解决方案,甚至还有朝思暮想明码模式的。胖哥也在后面写了一篇解决思路的文章。如同还是不过瘾,明天看到这篇文章的同学有福了,问题将在这里失去解决。

计划

目前这应该是Spring生态中最新的解决方案,没有之一。先看下流程,微服务无关的其它的组件这里先屏蔽了,剩下图的几个组件:

具体流程为

  • ①用户向网关申请登录或者通过网关申请资源服务器的资源。
  • ②网关发现用户没有受权发动基于OAuth2受权码的OIDC流程,向受权服务器Id Server发动受权申请。
  • ③受权服务器Id Server收到受权申请重定向到用户登录页面要求用户登录认证,以发动受权。
  • ④用户输出用户名明码进行登录认证。
  • ⑤Id Server受权服务器解决用户认证并重定向到网关约定的OAuth2 Redirect URI,这个过程属于规范的OIDC受权码流程。
  • ⑥网关取得AccessTokenIdToken

    • 如果最后发动的是登录就重定向到/
    • 如果最后发动的是申请资源服务器资源就令牌中继重定向到对应的资源。
  • 资源服务器通过⑦⑧两个链路响应用户的申请。

请留神,上述流程中生成的AccessTokenIdToken不容许提供给用户侧,否则会引起中间人攻打,默认提供的是一个cookie策略,大部分状况下这种策略是够用的,如果你须要自定义必须粗浅理解其机制,你能够通过我的Spring Security OAuth2专栏进行学习。

具体实现

依据下面的计划,咱们须要三个利用,别离是网关Spring Cloud Gateway利用、资源服务器利用Resource ServerOAuth2受权服务器Id Server

Spring Cloud Gateway

Spring Cloud Gateway 利用,端口8080,它不仅仅是一个网关还是一个在受权服务器Id Server注册的OAuth2客户端,通过Id Server你能够在一分钟内实现配置。它须要配置到资源服务器的路由规定和令牌中继性能。外围配置为:

spring:  application:    name: gateway  security:    oauth2:      client:        registration:          # 这里为客户端名称可自行更改          gatewayclient:            client-id: e4da4a32-592b-46f0-ae1d-784310e88423            # 明码为注册客户端时的明码            client-secret: secret            # 只能抉择一个            redirect-uri: http://127.0.0.1:8080/login/oauth2/code/gatewayclient            # 其它两种形式为refresh_token,client_credentials            authorization-grant-type: authorization_code            client-authentication-method: client_secret_basic            scope: message.write,userinfo,message.read,openid        provider:          gatewayclient:            # 要保障受权服务器地址能够被客户端拜访            issuer-uri: http://localhost:9000  cloud:    gateway:      routes:        - id: resource-server          uri: http://127.0.0.1:8084          predicates:            - Path=/res/**          filters:            - TokenRelay

Resource Server

资源服务器就是咱们平时编写的业务接口的服务器,端口这里定义为8084,它须要集成Spring Security及其Resource Server组件。它要负责定义资源接口的拜访权限,例如:

         // 只有message.read才有资格拜访资源/res/foo        httpSecurity.authorizeRequests()                .antMatchers("/res/foo").hasAnyAuthority("SCOPE_message.read") 

另外它还要和受权服务器Id Server通信获取AccessToken的解码公钥:

spring:  security:    oauth2:      resourceserver:        jwt:          jwk-set-uri: http://localhost:9000/oauth2/jwks

获取解码公钥的原理在我的Spring Security OAuth2专栏有具体介绍,这里不再赘述。

Id Server

仓库地址:https://github.com/NotFound40... 欢送star,欢送奉献。

Id Server是一个基于Spring Authorization Server的开源的受权服务器,它大大降低OAuth2受权服务器的学习应用难度,提供UI控制台,动静权限管制,不便OAuth2客户端治理,可一键生成Spring Security配置,开箱即用,大量配置批改就可部署,代码开源,不便二次开发,反对OAuth2四种客户端认证形式和三种受权模式。它是目前Spring平安生态中重要的组成部分,也是将来的技术发展趋势,更多信息请参阅Id Server我的项目仓库的介绍

Id Server在本文表演的是OAuth2受权服务器的角色,负责对受权申请进行解决,保护客户端注册信息,受权用户信息,后续会退出IDP反对,各种三方登录的用户也能够动静在这里进行登录,就像这样:

依据业务须要第三方OAuth2受权登录也能优雅的接入,当然,接入的登录形式须要OIDC或者OAuth2的反对。

DEMO以及应用办法

上述残缺DEMOId Server的仓库中的samples下。应用办法:

  • 拉取Id Server我的项目并加载依赖。
  • IntelliJ IDEA中顺次独自对samples文件夹下的所有我的项目的pom.xml进行右键菜单选中Add As Maven Project,这一步很重要。
  • 顺次启动Id Servergatewayresource-server三个我的项目。

测试登录

  • 浏览器拜访http://127.0.0.1:8080/login,点击http://localhost:9000
  • 输出用户名明码user/user
  • 能查看到认证信息就证实胜利了,再次重申,在生产中该信息非常敏感,不应该间接对前端裸露。
  • 浏览器拜访http://127.0.0.1:8080/res/foo,能够拜访到资源服务器的资源。

另一种测试

敞开浏览器从新关上,浏览器拜访http://127.0.0.1:8080/res/foo,你看看会产生什么?

总结

通过OAuth2客户端、Spring Cloud GatewayOAuth2受权服务器、OAuth2资源服务器的联动,你会发现受权码模式也能够实现残缺的微服务认证受权,而且比明码模式更加平安。后续Id Server实现了联结登录之后,其它第三方登录也能够无缝集成进来。多多关注,更多先进的黑科技等着你。

关注公众号:Felordcn 获取更多资讯

集体博客:https://felord.cn