我想为除一个 url 之外的整个应用程序启用 oauth2。
我的配置:
@EnableWebFluxSecurity
class SecurityConfig {
@Bean
fun securityWebFilterChain(http: ServerHttpSecurity) =
http
.authorizeExchange()
.pathMatchers("/devices/**/register").permitAll()
.and()
.oauth2Login().and()
.build()
}
application.yml:
spring.security.oauth2.client.registration.google.client-id: ...
spring.security.oauth2.client.registration.google.client-secret: ...
所有路径都受到 oauth2 保护,但问题是当我调用允许的端点时
/devices/123/register
然后我得到的响应是:
CSRF Token has been associated to this client
我需要以不同的方式配置此路径吗?
permitAll
仅是关于权威的声明——所有典型的Web应用程序漏洞仍然受到缓解,如XSS和CSRF。
如果你试图表明
/devices/**/register
应该被 Spring Security 完全忽略,那么你可以这样做:
http
.securityMatcher(new NegatedServerWebExchangeMatcher(
pathMatchers("/devices/**/register")))
... omit the permitAll statement
但是,如果您仍然希望该端点获取安全响应标头,而不是 CSRF 保护,那么您可以这样做:
http
.csrf()
.requireCsrfProtectionMatcher(new NegatedServerWebExchangeMatcher(
pathMatchers("/devices/**/register")))
... keep the permitAll statement
如果您只想禁用 csrf,则无法覆盖 securityFilterChain 默认行为。
就我而言,我需要复制 springSecurityFilterChain 的默认配置并添加 csrf 配置为:
@Bean
public SecurityWebFilterChain csrfFilterChain(ServerHttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeExchange((exchange) -> exchange.anyExchange().authenticated());
http.oauth2Login(withDefaults());
http.oauth2Client(withDefaults());
return http.build();
}