微服务架构之Spring Boot(四十)

2022-04-07 20:02:22 浏览数 (1)

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 。

0 人点赞