使用 Spring 授权服务器配置 Spring 网关

Configure Spring Gateway with Spring Authorization Server

我有 Spring 具有以下 Gradle 依赖项的网关应用程序:

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 授权服务器成功授权后转发 /api/management/home/clients/summary 到内部 link /management/home/clients/summary。是否可以使用 Spring 授权服务器而不将其暴露给外部? 实现这个的正确方法是什么?

代码示例:https://github.com/rcbandit111/Spring_Cloud_Gateway_POC

Is it possible to use Spring Authorization server without exposing it to outside?

Spring 授权服务器正在实施 OAuth2 协议。如果我们查看规范,我们可以看到它自然是一个客户端,它想要对自己进行身份验证:https://datatracker.ietf.org/doc/html/rfc6749#section-1.2。在您的设置中,客户端似乎不是网关本身,而是一个应用程序。因此,如果该应用程序应使用 Spring 授权服务器,它会在与网关进行第一次交互之前对其进行身份验证(大多数情况下,这意味着获取令牌)。 所以要回答这个问题,如果你想按原样使用 OAuth2,你需要在应用程序和 Spring 授权服务器之间建立直接连接,这意味着它需要暴露给外部.这是完全有道理的,因为 OAuth2 不是要与单一服务一起使用,而是要与许多不同的服务一起使用,例如允许单点登录。

What is the proper way to implement this?

您可以设置自己的 Spring 授权服务器,实现您自定义的授权代码授予逻辑,以便客户端可以验证自己并获取令牌。例如,这可以是 JSON Web 令牌 (JWT)。这可以(应该)独立于您的网关和其他服务。

要在网关授权请求,有不同的方法。您可以自己实现一个逻辑,它从请求中读取 JWT 并使用 Spring 授权服务器或您可能拥有的其他身份提供者对其进行授权。 您还可以将 Spring 云安全与 Spring 授权服务器一起使用,如下所述:https://spring.io/blog/2019/08/16/securing-services-with-spring-cloud-gateway。这绝对是一个正确的实现方式。

还有一件事:如您所见,OAuth2 是有代价的,因为理解和配置它并非易事。在部署此类设置之前,您必须详细了解它。另一方面,它是一个可靠的标准,您可以拥有开箱即用的单点登录等功能。因此,如果您只需要将单个或多个应用程序授权给单个服务,则可能有更简单的方法来获取令牌并保护应用程序,而 OAuth2 可能有点矫枉过正。但是 OAuth2 确实值得,如果您有很多服务和应用程序应该使用中央(有时是公司范围的)解决方案进行身份验证。