在 Spring Weblux 中禁用给定路径的身份验证和 csrf?

问题描述 投票:0回答:2

我想为除一个 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

我需要以不同的方式配置此路径吗?

spring-security kotlin spring-security-oauth2 spring-webflux csrf-protection
2个回答
4
投票

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

0
投票

如果您只想禁用 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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.