【发布时间】:2019-11-01 08:32:51
【问题描述】:
我有一个项目https://github.com/ndrone/sample-gateway-oauth2login/tree/feature/allowAllToHealth 我试图允许任何请求它的人打开特定的 URL。在这种情况下,它是 Actuator 的健康端点,同时保护所有其他 Actuator 端点。我发现TokenRelayGatewayFilterFactory 被应用于所有路由,尽管它只设置为应用于一个路由。不知道我做错了什么。
资源服务中的SecurityConfig
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) throws Exception {
http.authorizeExchange().pathMatchers("/manage/health").permitAll();
http
.authorizeExchange()
.pathMatchers("/resource", "/manage/**").hasAuthority("SCOPE_resource.read")
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
return http.build();
}
}
网关路由
@Controller
@SpringBootApplication
public class GatewayApplication {
@Autowired
private TokenRelayGatewayFilterFactory filterFactory;
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
//@formatter:off
return builder.routes()
.route("resource-health", r -> r.path("/resource/manage/health")
.filters(f -> f.stripPrefix(1))
.uri("http://localhost:9000"))
.route("resource-actuator-protected", r -> r.path("/resource/manage/**")
.filters(f -> f.stripPrefix(1).filter(filterFactory.apply()))
.uri("http://localhost:9000"))
.route("resource", r -> r.path("/resource")
.filters(f -> f.filter(filterFactory.apply()))
.uri("http://localhost:9000"))
.build();
//@formatter:on
}
@GetMapping("/")
public String index(Model model,
@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,
@AuthenticationPrincipal OAuth2User oauth2User) {
model.addAttribute("userName", oauth2User.getName());
model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());
model.addAttribute("userAttributes", oauth2User.getAttributes());
return "index";
}
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
【问题讨论】:
-
你看到了什么让你认为它适用于所有事情?
-
@spencergibb 当我打开 URL localhost:8080//resource/manage/health 时,它会将我重定向到登录页面。如果我直接访问资源 localhost:9000/mange/health,它确实给了我 200 的健康端点结果
-
你的 spring 安全配置不这样做吗?
-
@spencergibb 我不明白你的问题...资源服务器上的安全配置按预期工作localhost:9000/manage/health 已打开所有其他执行器端点都受到保护并返回 401。如果我接受通过网关localhost:8080/manage/health 的相同请求将我重定向到 uaa 登录页面。这不应该发生,因为它是打开的,并且
TokenRelayGatewayFilterFactory未应用于该路由过滤器链。 -
@spencergibb 经过一番挖掘后,我意识到网关的执行器端点处于活动状态,因此我尝试访问网关的localhost:8080/actuator/health,它还将我重定向到 uaa 登录页面。那么可以说网关 default 安全配置是为了保护所有端点/路由吗?有没有我应该看的例子来说明如何在网关中配置它?
标签: spring-cloud spring-cloud-gateway spring-cloud-security