此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

Spring Security 的 WebFlux 支持依赖于 ,并且对 Spring WebFlux 和 Spring WebFlux.Fn 的工作方式相同。 一些示例应用程序演示了代码:WebFilterSpring中文文档

最低 WebFlux 安全配置

以下列表显示了最低 WebFlux 安全性配置:Spring中文文档

最低 WebFlux 安全配置
@Configuration
@EnableWebFluxSecurity
public class HelloWebfluxSecurityConfig {

	@Bean
	public MapReactiveUserDetailsService userDetailsService() {
		UserDetails user = User.withDefaultPasswordEncoder()
			.username("user")
			.password("user")
			.roles("USER")
			.build();
		return new MapReactiveUserDetailsService(user);
	}
}
@Configuration
@EnableWebFluxSecurity
class HelloWebfluxSecurityConfig {

    @Bean
    fun userDetailsService(): ReactiveUserDetailsService {
        val userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("user")
                .roles("USER")
                .build()
        return MapReactiveUserDetailsService(userDetails)
    }
}

此配置提供表单和 HTTP 基本身份验证,设置授权以要求经过身份验证的用户访问任何页面,设置默认登录页和默认注销页,设置与安全相关的 HTTP 标头,添加 CSRF 保护等。Spring中文文档

显式 WebFlux 安全配置

以下页面显示了最低 WebFlux 安全性配置的显式版本:Spring中文文档

显式 WebFlux 安全配置
@Configuration
@EnableWebFluxSecurity
public class HelloWebfluxSecurityConfig {

	@Bean
	public MapReactiveUserDetailsService userDetailsService() {
		UserDetails user = User.withDefaultPasswordEncoder()
			.username("user")
			.password("user")
			.roles("USER")
			.build();
		return new MapReactiveUserDetailsService(user);
	}

	@Bean
	public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
		http
			.authorizeExchange(exchanges -> exchanges
			    .anyExchange().authenticated()
			)
			.httpBasic(withDefaults())
			.formLogin(withDefaults());
		return http.build();
	}
}
import org.springframework.security.config.web.server.invoke

@Configuration
@EnableWebFluxSecurity
class HelloWebfluxSecurityConfig {

    @Bean
    fun userDetailsService(): ReactiveUserDetailsService {
        val userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("user")
                .roles("USER")
                .build()
        return MapReactiveUserDetailsService(userDetails)
    }

    @Bean
    fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http {
            authorizeExchange {
                authorize(anyExchange, authenticated)
            }
            formLogin { }
            httpBasic { }
        }
    }
}
请确保在 Kotlin 类中导入该函数,有时 IDE 不会自动导入该函数,从而导致编译问题。invoke

此配置显式设置了与最小配置相同的所有内容。 从这里,您可以更轻松地更改默认值。Spring中文文档

您可以通过config/src/test/ 目录中搜索 EnableWebFluxSecurity 来找到单元测试中显式配置的更多示例。Spring中文文档

多链支持

您可以配置多个实例以按实例单独配置。SecurityWebFilterChainRequestMatcherSpring中文文档

例如,您可以隔离以以下开头的 URL 的配置:/apiSpring中文文档

@Configuration
@EnableWebFluxSecurity
static class MultiSecurityHttpConfig {

    @Order(Ordered.HIGHEST_PRECEDENCE)                                                      (1)
    @Bean
    SecurityWebFilterChain apiHttpSecurity(ServerHttpSecurity http) {
        http
            .securityMatcher(new PathPatternParserServerWebExchangeMatcher("/api/**"))      (2)
            .authorizeExchange((exchanges) -> exchanges
                .anyExchange().authenticated()
            )
            .oauth2ResourceServer(OAuth2ResourceServerSpec::jwt);                           (3)
        return http.build();
    }

    @Bean
    SecurityWebFilterChain webHttpSecurity(ServerHttpSecurity http) {                       (4)
        http
            .authorizeExchange((exchanges) -> exchanges
                .anyExchange().authenticated()
            )
            .httpBasic(withDefaults());                                                     (5)
        return http.build();
    }

    @Bean
    ReactiveUserDetailsService userDetailsService() {
        return new MapReactiveUserDetailsService(
                PasswordEncodedUser.user(), PasswordEncodedUser.admin());
    }

}
import org.springframework.security.config.web.server.invoke

@Configuration
@EnableWebFluxSecurity
open class MultiSecurityHttpConfig {
    @Order(Ordered.HIGHEST_PRECEDENCE)                                                      (1)
    @Bean
    open fun apiHttpSecurity(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http {
            securityMatcher(PathPatternParserServerWebExchangeMatcher("/api/**"))           (2)
            authorizeExchange {
                authorize(anyExchange, authenticated)
            }
            oauth2ResourceServer {
                jwt { }                                                                     (3)
            }
        }
    }

    @Bean
    open fun webHttpSecurity(http: ServerHttpSecurity): SecurityWebFilterChain {            (4)
        return http {
            authorizeExchange {
                authorize(anyExchange, authenticated)
            }
            httpBasic { }                                                                   (5)
        }
    }

    @Bean
    open fun userDetailsService(): ReactiveUserDetailsService {
        return MapReactiveUserDetailsService(
            PasswordEncodedUser.user(), PasswordEncodedUser.admin()
        )
    }
}
1 配置 a with an 以指定 Spring Security 应首先考虑的SecurityWebFilterChain@OrderSecurityWebFilterChain
2 用于声明这仅适用于以PathPatternParserServerWebExchangeMatcherSecurityWebFilterChain/api/
3 指定将用于终结点的身份验证机制/api/**
4 创建另一个优先级较低的实例以匹配所有其他 URLSecurityWebFilterChain
5 指定将用于应用程序其余部分的身份验证机制

Spring Security 为每个请求选择一个。 它按定义顺序匹配请求。SecurityWebFilterChain@BeansecurityMatcherSpring中文文档

在这种情况下,这意味着,如果 URL 路径以 开头,Spring Security 使用 . 如果 URL 不是以 开头,则 Spring Security 默认为 ,它具有与任何请求匹配的隐含。/apiapiHttpSecurity/apiwebHttpSecuritysecurityMatcherSpring中文文档

请确保在 Kotlin 类中导入该函数,有时 IDE 不会自动导入该函数,从而导致编译问题。invoke
1 配置 a with an 以指定 Spring Security 应首先考虑的SecurityWebFilterChain@OrderSecurityWebFilterChain
2 用于声明这仅适用于以PathPatternParserServerWebExchangeMatcherSecurityWebFilterChain/api/
3 指定将用于终结点的身份验证机制/api/**
4 创建另一个优先级较低的实例以匹配所有其他 URLSecurityWebFilterChain
5 指定将用于应用程序其余部分的身份验证机制