我试图设置多个安全配置,将使用不同的 SecurityApiKeyFilter
基于 pathMatchers
,现在我只有2个。一个适用于所有url,另一个只适用于包含 admin
. 最初,您被设置为访客,之后,我们将尝试基于apikey对您进行授权。然而,我真的不能让它到达第二个 SecurityWebFilterChain
配置。即使 pathMatcher
设置为这样。
@Bean
@Order(1)
public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http,
ClientService clientService) {
SecurityWebFilterChain filterChain = http.authorizeExchange()
.pathMatchers(HttpMethod.GET, "/").permitAll()
.pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.pathMatchers("/**").permitAll()
.anyExchange().authenticated().and()
.anonymous().principal("guest").and()
.addFilterBefore(new SecurityApiKeyFilter(clientService), SecurityWebFiltersOrder.AUTHENTICATION)
.oauth2ResourceServer().jwt()
.jwtDecoder(new NimbusReactiveJwtDecoder("/.well-known/jwks.json"))
.and()
.and().build();
return filterChain;
}
@Bean
@Order(2)
public SecurityWebFilterChain sdkJsWebFilterChain(ServerHttpSecurity http,
ClientService clientService) {
SecurityWebFilterChain filterChain = http.authorizeExchange()
.pathMatchers(HttpMethod.OPTIONS, "**/admin/**").permitAll()
.pathMatchers("**/admin/**").permitAll()
.anyExchange().authenticated().and()
.anonymous().principal("guest").and()
.addFilterBefore(new Admin.SecurityApiKeyFilter(clientService),
SecurityWebFiltersOrder.AUTHENTICATION)
.oauth2ResourceServer().jwt()
.jwtDecoder(new NimbusReactiveJwtDecoder("/.well-known/jwks.json"))
.and()
.and().build();
return filterChain;
}
谢谢。
2条答案
按热度按时间bksxznpy1#
我猜React应用程序和servlet应用程序的行为是一样的。
您的第二个安全过滤器链不会被执行,因为只有第一个匹配的安全过滤器链会被调用,请参见9.4。安全筛选器链:
9.4. 安全过滤器链
[...]
事实上,
FilterChainProxy
可用于确定SecurityFilterChain
应该使用。这允许为应用程序的不同部分提供完全独立的配置。在多重安全过滤器链图中
FilterChainProxy
决定哪个SecurityFilterChain
应该使用。只有第一个SecurityFilterChain
将调用匹配项。如果/api/messages/
请求时,它将首先匹配SecurityFilterChain0
的模式/api/**
,仅此而已SecurityFilterChain0
即使它也匹配SecurityFilterChainn
. 如果/messages/
是请求的,它在上不匹配SecurityFilterChain0
的模式/api/**
,所以FilterChainProxy
将继续尝试每个SecurityFilterChain
. 假设没有其他人,SecurityFilterChain
示例匹配SecurityFilterChainn
将被调用。u1ehiz5o2#
我也发现这是非常有用的,如果有人正在寻找其他类型的解决方案,它不是在java,但你会得到要点。
资料来源:https://github.com/jimonthebarn/spring-webflux-multiple-auth-mechanisms/blob/master/src/main/kotlin/localhost/playground/multi/auth/securityconfig.kt