Spring OAuthorization Server 自定义配置非常重要,后面的所有定制配置都是基于此。本文先介绍 OAuth2AuthorizationServerConfigurer
提供的配置选项,并使用 Provider Settings 和 Client Authentication 作为例子。
OAuth2AuthorizationServerConfigurer
提供了为 OAuth2 授权服务器完全自定义安全配置的能力。它允许您指定要使用的核心组件——例如,RegisteredClientRepository
、OAuth2AuthorizationService
、OAuth2TokenGenerator
等。此外,它还允许为协议端点自定义请求处理逻辑——例如,授权端点、token 端点、token 内省端点等。
OAuth2AuthorizationServerConfigurer
提供以下配置选项:
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer<>();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
// 用于管理新的和现有的客户端。
.registeredClientRepository(registeredClientRepository)
// 用于管理新的和现有的授权。
.authorizationService(authorizationService)
// 用于管理新的和现有的授权许可。
.authorizationConsentService(authorizationConsentService)
// 用于自定义 OAuth2 授权服务器的配置设置。
.providerSettings(providerSettings)
// 用于生成 OAuth2 授权服务器支持的令牌。
.tokenGenerator(tokenGenerator)
// OAuth2 客户端身份认证的配置器。
.clientAuthentication(clientAuthentication -> { })
// OAuth2 授权端点的配置器。
.authorizationEndpoint(authorizationEndpoint -> { })
// OAuth2 token 端点的配置器。
.tokenEndpoint(tokenEndpoint -> { })
// OAuth2 token 内省端点的配置器。
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint -> { })
// OAuth2 token 撤销端点的配置器。
.tokenRevocationEndpoint(tokenRevocationEndpoint -> { })
.oidc(oidc -> oidc
// OpenID Connect 1.0 UserInfo 端点的配置器。
.userInfoEndpoint(userInfoEndpoint -> { })
// OpenID Connect 1.0 客户端注册端点的配置器。
.clientRegistrationEndpoint(clientRegistrationEndpoint -> { })
);
return http.build();
}
配置 Provider Settings
ProviderSettings
包含 OAuth2 授权服务器的配置设置。它指定协议端点的 URI 以及发行者(issuer)。协议端点的默认 URI 如下:
public final class ProviderSettings extends AbstractSettings {
...
public static Builder builder() {
return new Builder()
.authorizationEndpoint("/oauth2/authorize")
.tokenEndpoint("/oauth2/token")
.tokenIntrospectionEndpoint("/oauth2/introspect")
.tokenRevocationEndpoint("/oauth2/revoke")
.jwkSetEndpoint("/oauth2/jwks")
.oidcUserInfoEndpoint("/userinfo")
.oidcClientRegistrationEndpoint("/connect/register");
}
...
}
下面的例子展示了如何自定义配置设置并注册到 bean 容器中:
@Bean
public ProviderSettings providerSettings() {
return ProviderSettings.builder()
.issuer("https://example.com")
.authorizationEndpoint("/oauth2/v1/authorize")
.tokenEndpoint("/oauth2/v1/token")
.tokenIntrospectionEndpoint("/oauth2/v1/introspect")
.tokenRevocationEndpoint("/oauth2/v1/revoke")
.jwkSetEndpoint("/oauth2/v1/jwks")
.oidcUserInfoEndpoint("/connect/v1/userinfo")
.oidcClientRegistrationEndpoint("/connect/v1/register")
.build();
}
ProviderContext
是一个上下文对象,它保存有关 provider 的信息。它提供对 ProviderSettings
和“当前”颁发者(issuer)的访问。ProviderContext
可以通过 ProviderContextHolder 获取,后者通过使用 ThreadLocal 将其与当前请求线程关联起来。
除了将 ProviderSettings 注册到 bean 容器中,还可以通过上面提到的 OAuth2AuthorizationServerConfigurer
配置:
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer<>();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
...
// 用于自定义 OAuth2 授权服务器的配置设置。
.providerSettings(providerSettings)
...;
return http.build();
}
配置 Client Authentication
OAuth2AuthorizationServerConfigurer
提供自定义 OAuth2 客户端身份认证的能力。它定义了扩展点,允许您为客户端身份认证请求自定义预处理、主处理和后处理逻辑。
OAuth2AuthorizationServerConfigurer
提供以下配置选项:
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer<>();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.clientAuthentication(clientAuthentication ->
clientAuthentication
// 尝试从 HttpServletRequest 提取客户端凭证到 OAuth2ClientAuthenticationToken 实例时使用的 AuthenticationConverter(预处理器)。
.authenticationConverter(authenticationConverter)
// 用于对 OAuth2ClientAuthenticationToken 进行身份验证的 AuthenticationProvider(主处理器)。(可以添加一个或多个替换默认值。)
.authenticationProvider(authenticationProvider)
// AuthenticationSuccessHandler(后处理器)用于处理成功的客户端身份验证并将 OAuth2ClientAuthenticationToken 关联到SecurityContext。
.authenticationSuccessHandler(authenticationSuccessHandler)
// AuthenticationFailureHandler(后处理器),用于处理客户端身份验证失败并返回 OAuth2Error 响应。
.errorResponseHandler(errorResponseHandler)
);
return http.build();
}
OAuth2AuthorizationServerConfigurer
配置了 OAuth2ClientAuthenticationFilter
,并将其注册到 OAuth2 授权服务器 SecurityFilterChain
中。OAuth2ClientAuthenticationFilter
是处理客户端身份验证请求的过滤器。
默认情况下,OAuth2 token 端点、OAuth2 token 内省端点和 OAuth2 token 撤销端点需要进行客户端身份认证。支持的客户端身份认证方法有client_secret_basic
、client_secret_post
、private_key_jwt
、client_secret_jwt
和 none
(公共客户端)。
OAuth2ClientAuthenticationFilter
配置了以下默认值:
AuthenticationConverter
— 一个由JwtClientAssertionAuthenticationConverter
、ClientSecretBasicAuthenticationConverter
、ClientSecretPostAuthenticationConverter
和PublicClientAuthenticationConverter
组成的DelegatingAuthenticationConverter
。AuthenticationManager
— 由JwtClientAssertionAuthenticationProvider
、ClientSecretAuthenticationProvider
和PublicClientAuthenticationProvider
组成的AuthenticationManager
。AuthenticationSuccessHandler
— 将“已认证”的OAuth2ClientAuthenticationToken
(当前的Authentication
)与SecurityContext
关联的内部实现。AuthenticationFailureHandler
— 使用与OAuth2AuthenticationException
关联的OAuth2Error
返回 OAuth2 错误响应的内部实现。
项目实战
Spring Authorization Server 实战项目:
Gitee | GitHub | |
---|---|---|
后端 | https://gitee.com/linjiabin100/pi-cloud.git | https://github.com/zengpi/pi-cloud.git |
前端 | https://gitee.com/linjiabin100/pi-cloud-web.git | https://github.com/zengpi/pi-cloud-web.git |