我有一个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();
}在使用成功授权后,我希望将/api/management/home/clients/summary转发到内部链接/management/home/clients/summary。是否可以不向外界公开使用Spring授权服务器?实现这一点的正确方法是什么?
代码示例:https://github.com/rcbandit111/Spring_Cloud_Gateway_POC
发布于 2022-01-20 11:40:54
是否可以在不向外界公开的情况下使用?
正在实现OAuth2协议。如果我们看一下规范,我们可以看到它自然是一个客户端,它想要验证自己:https://datatracker.ietf.org/doc/html/rfc6749#section-1.2。在您的设置中,客户端似乎不是网关本身,而是一个应用程序。因此,如果该应用程序使用,它将在与网关进行第一次交互之前使用它进行身份验证(大多数情况下,这意味着获取令牌)。因此,要回答这个问题,如果您想要使用OAuth2,您需要在应用程序和之间建立一个直接的连接,这意味着它需要暴露在外部。这是完全合理的,因为OAuth2不是用于单个服务,而是用于许多不同的服务,例如允许单点登录。
实现这一点的正确方法是什么?
您可以设置您自己的Spring授权服务器,实现您的自定义授权代码授权逻辑,以便客户端能够对自己进行身份验证并获取令牌。例如,这可以是一个JSON令牌(JWT)。这可以独立于您的网关和其他服务。
要在网关上授权请求,有不同的方法。您可以自己实现一个逻辑,它从请求中读取一个JWT,并使用或其他身份提供程序对其进行授权,这是您可能拥有的。您还可以在中使用Security,这一点在这里描述:https://spring.io/blog/2019/08/16/securing-services-with-spring-cloud-gateway。这绝对是实现它的正确方法。
还有一件事:正如您所看到的,OAuth2是有代价的,理解和配置并不简单。在部署这样的设置之前,您必须详细了解它。另一方面,这是一个坚实的标准,你可以有一个功能,如单点-打开框。因此,如果您只需要单个或多个应用程序对单个服务的授权,那么可能有更容易获得令牌和保护应用程序的方法,而OAuth2可能是过火了。但是,如果你有大量的服务和应用程序,应该通过一个中央(有时是全公司范围)的解决方案来验证,那么OAuth2真的会有回报。
https://stackoverflow.com/questions/69030184
复制相似问题