spring - 使用 Spring Authorization Server 配置 Spring Gateway
问题描述
我有具有以下 Gradle 依赖项的 Spring Gateway 应用程序:
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-gateway'
implementation 'com.netflix.eureka:eureka-core'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
路线配置:
@Bean
public RouteLocator routes(RouteLocatorBuilder builder, LoggingGatewayFilterFactory loggingFactory) {
return builder.routes()
.route("service_route_clients_summary", r -> r.path("/management/home/clients/summary")
.filters(f -> f.rewritePath("/api/management/home/clients/summary", "/management/home/clients/summary")
.filter(loggingFactory.apply(new LoggingGatewayFilterFactory.Config("My Custom Message", true, true))))
.uri("lb://merchant-hub-admin-service:8000/management/home/clients/summary"))
.build();
}
在使用 Spring Authorization Server 成功授权后,我想转发/api/management/home/clients/summary
到内部链接。/management/home/clients/summary
是否可以使用 Spring 授权服务器而不将其暴露在外部?实现这一点的正确方法是什么?
代码示例:https ://github.com/rcbandit111/Spring_Cloud_Gateway_POC
解决方案
是否可以使用 Spring 授权服务器而不将其暴露在外部?
Spring Authorization Server 正在实现 OAuth2 协议。如果我们查看规范,我们可以看到它自然是一个想要验证自己的客户端:https ://datatracker.ietf.org/doc/html/rfc6749#section-1.2. 在您的设置中,该客户端似乎不是网关本身,而是一个应用程序。因此,如果该应用程序应该使用 Spring Authorization Server,它将在与网关的第一次交互发生之前对其进行身份验证(大多数情况下,这意味着获取令牌)。所以要回答这个问题,如果你想使用 OAuth2,你需要在应用程序和 Spring 授权服务器之间建立直接连接,这意味着它需要暴露给外部。这是非常有意义的,因为 OAuth2 不是用于单一服务,而是用于许多不同的服务,例如允许单点登录。
实现这一点的正确方法是什么?
您可以设置自己的 Spring 授权服务器,实现自定义授权代码授予逻辑,以便客户端可以验证自己并获取令牌。例如,这可以是 JSON Web 令牌 (JWT)。这可以(应该)独立于您的网关和其他服务。
要在网关处授权请求,有不同的方法。您可以自己实现一个逻辑,该逻辑从请求中读取 JWT 并使用 Spring Authorization Server 或您可能拥有的其他身份提供者对其进行授权。您还可以将 Spring Cloud Security 与 Spring Authorization Server 一起使用,如下所述:https ://spring.io/blog/2019/08/16/securing-services-with-spring-cloud-gateway 。这绝对是实现它的正确方法。
还有一件事:如您所见,OAuth2 是有代价的,因为理解和配置并非易事。在部署此类设置之前,您必须详细了解它。另一方面,它是一个可靠的标准,您可以拥有开箱即用的单点登录等功能。因此,如果您只需要对单个服务或多个应用程序进行授权,则可能有更简单的方法来获取令牌并保护应用程序,而 OAuth2 可能是矫枉过正。但是,如果您有大量服务和大量应用程序应该使用中央(有时是公司范围的)解决方案进行身份验证,那么 OAuth2 确实会带来回报。
推荐阅读
- docker - 为 Zookeeper 和 Spring Cloud 编写 Docker - 我的服务未连接到 Zoo
- html - place-items 和 align-items 有什么区别?
- r - R中的交互式plot_ly()为空
- iis - 如何使用动态路径在 IIS 中创建 rewriteMap?
- php - Laravel reduce loading time of 50k rows belongTo count query
- graph - 减少gnuplot中轴上的标签数量
- google-sheets - 按小时而不是按天计步公式
- google-cloud-functions - 使用云功能删除 Firebase 存储上的文件时出现错误 No such Object
- google-cloud-platform - GCE 工作时如何部署新代码?
- testing - 当它们在后台时,Testcafe 没有在铬浏览器中运行测试