首页 > 解决方案 > 使用 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

标签: springspring-bootspring-cloudspring-cloud-gatewayspring-oauth2

解决方案


是否可以使用 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 确实会带来回报。


推荐阅读