29.2 WebFlux安全性
与Spring MVC应用程序类似,您可以通过添加 spring-boot-starter-security 依赖项来保护WebFlux应用程序。默认安全配置
在 ReactiveSecurityAutoConfiguration 和 UserDetailsServiceAutoConfiguration 中实现。ReactiveSecurityAutoConfiguration
导入用于Web安全的 WebFluxSecurityConfiguration 和用于配置身份验证的 UserDetailsServiceAutoConfiguration ,这在非Web应用
程序中也是相关的。要完全关闭默认Web应用程序安全配置,您可以添加bean类型 WebFilterChainProxy (这样做不会禁
用 UserDetailsService 配置或执行器的安全性)。
要同时关闭 UserDetailsService 配置,您可以添加bean类型 ReactiveUserDetailsService 或 ReactiveAuthenticationManager 。
可以通过添加自定义 SecurityWebFilterChain 来配置访问规则。Spring Boot提供了便捷方法,可用于覆盖执行器端点和静态资源的访问规
则。EndpointRequest 可用于创建基于 management.endpoints.web.base-path 属性的 ServerWebExchangeMatcher 。
PathRequest 可用于为常用位置的资源创建 ServerWebExchangeMatcher 。
例如,您可以通过添加以下内容来自定义安全配置:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.authorizeExchange()
.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.pathMatchers("/foo", "/bar")
.authenticated().and()
.formLogin().and()
.build();
}
29.3 OAuth2
OAuth2是Spring支持的广泛使用的授权框架。
29.3.1客户
如果您的类路径上有 spring-security-oauth2-client ,则可以利用一些自动配置来轻松设置OAuth2 / Open ID Connect客户端。此配置使
用 OAuth2ClientProperties 下的属性。相同的属性适用于servlet和反应应用程序。
您可以在 spring.security.oauth2.client 前缀下注册多个OAuth2客户端和提供商,如以下示例所示:
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=http://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=http://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=http://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=http://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
对于支持OpenID Connect发现的 OpenID Connect提供程序,可以进一步简化配置。提供程序需要配置 issuer-uri ,这是它声明为其颁发者
标识符的URI。例如,如果提供的 issuer-uri 为“https://example.com”,则会将 OpenID Provider Configuration Request 设置
为“https://example.com/.well-known/openid-configuration”。结果预计为 OpenID Provider Configuration Response 。以下示例显
示如何使用 issuer-uri 配置OpenID Connect Provider:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
默认情况下,Spring安全性 OAuth2LoginAuthenticationFilter 仅处理与 /login/oauth2/code/* 匹配的网址。如果要自定
义 redirect-uri 以使用其他模式,则需要提供配置以处理该自定义模式。例如,对于servlet应用程序,您可以添加类似于以下内容
的 WebSecurityConfigurerAdapter :
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri("/custom-callback");
}
}
OAuth2共同提供者的客户注册
对于常见的OAuth2和OpenID提供商,包括Google,Github,Facebook和Okta,我们提供了一组提供商默认值(分别
为 google , github , facebook 和 okta )。
如果您不需要自定义这些提供程序,则可以将 provider 属性设置为您需要推断默认值的属性。此外,如果客户端注册的密钥与默认支持的提供
者匹配,则Spring Boot也会推断出。
换句话说,以下示例中的两个配置使用Google提供程序:
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
29.3.2资源服务器
如果类路径上有 spring-security-oauth2-resource-server ,只要指定了JWK Set URI或OIDC Issuer URI,Spring Boot就可以设置
OAuth2资源服务器,如以下示例所示:
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
相同的属性适用于servlet和反应应用程序。
或者,您可以为servlet应用程序定义自己的 JwtDecoder bean,或者为响应式应用程序定义 ReactiveJwtDecoder 。