协议端点
OAuth2 授权端点
OAuth2AuthorizationEndpointConfigurer
提供了自定义 OAuth2 授权端点 的功能。它定义了扩展点,让你可以自定义 OAuth2 授权请求 的预处理、主处理和后处理逻辑。
OAuth2AuthorizationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.authorizationEndpoint(authorizationEndpoint ->
authorizationEndpoint
.authorizationRequestConverter(authorizationRequestConverter) (1)
.authorizationRequestConverters(authorizationRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.authorizationResponseHandler(authorizationResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
.consentPage("/oauth2/v1/authorize") (7)
);
return http.build();
}
1 | authorizationRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 提取 OAuth2 授权请求(或同意)到 OAuth2AuthorizationCodeRequestAuthenticationToken 或 OAuth2AuthorizationConsentAuthenticationToken 的实例。 |
2 | authorizationRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加 AuthenticationProvider (主处理器),用于对 OAuth2AuthorizationCodeRequestAuthenticationToken 或 OAuth2AuthorizationConsentAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | authorizationResponseHandler() :用于处理“已验证”的 OAuth2AuthorizationCodeRequestAuthenticationToken 和返回 OAuth2AuthorizationResponse 的 AuthenticationSuccessHandler (后处理器)。 |
6 | errorResponseHandler() :用于处理 OAuth2AuthorizationCodeRequestAuthenticationException 和返回 OAuth2Error 响应 的 AuthenticationFailureHandler (后处理器)。 |
7 | consentPage() :如果在授权请求流程期间需要同意,则将资源所有者重定向到的自定义同意页面的 URI 。 |
OAuth2AuthorizationEndpointConfigurer
配置 OAuth2AuthorizationEndpointFilter
,并使用 OAuth2 授权服务器 SecurityFilterChain
@Bean
注册它。OAuth2AuthorizationEndpointFilter
是处理 OAuth2 授权请求(和同意)的 Filter
。
OAuth2AuthorizationEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 由OAuth2AuthorizationCodeRequestAuthenticationConverter
和OAuth2AuthorizationConsentAuthenticationConverter
组成的DelegatingAuthenticationConverter
。 -
AuthenticationManager
— 由OAuth2AuthorizationCodeRequestAuthenticationProvider
和OAuth2AuthorizationConsentAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 处理“已认证”的OAuth2AuthorizationCodeRequestAuthenticationToken
并返回OAuth2AuthorizationResponse
的内部实现。 -
AuthenticationFailureHandler
— 使用与OAuth2AuthorizationCodeRequestAuthenticationException
关联的OAuth2Error
并返回OAuth2Error
响应的内部实现。
自定义授权请求验证
OAuth2AuthorizationCodeRequestAuthenticationValidator
是用于验证授权码授权中使用的特定 OAuth2 授权请求参数的默认验证器。默认实现验证 redirect_uri
和 scope
参数。如果验证失败,则会抛出 OAuth2AuthorizationCodeRequestAuthenticationException
。
OAuth2AuthorizationCodeRequestAuthenticationProvider
提供了通过向 setAuthenticationValidator()
提供类型为 Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext>
的自定义身份验证验证器来覆盖默认授权请求验证的功能。
OAuth2AuthorizationCodeRequestAuthenticationContext 保存 OAuth2AuthorizationCodeRequestAuthenticationToken ,其中包含 OAuth2 授权请求参数。
|
如果验证失败,则身份验证验证器必须抛出 OAuth2AuthorizationCodeRequestAuthenticationException 。
|
开发生命周期阶段的常见用例是在 redirect_uri
参数中允许 localhost
。
以下示例展示了如何使用允许在 redirect_uri
参数中使用 localhost
的自定义身份验证验证器来配置 OAuth2AuthorizationCodeRequestAuthenticationProvider
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.authorizationEndpoint(authorizationEndpoint ->
authorizationEndpoint
.authenticationProviders(configureAuthenticationValidator())
);
return http.build();
}
private Consumer<List<AuthenticationProvider>> configureAuthenticationValidator() {
return (authenticationProviders) ->
authenticationProviders.forEach((authenticationProvider) -> {
if (authenticationProvider instanceof OAuth2AuthorizationCodeRequestAuthenticationProvider) {
Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> authenticationValidator =
// Override default redirect_uri validator
new CustomRedirectUriValidator()
// Reuse default scope validator
.andThen(OAuth2AuthorizationCodeRequestAuthenticationValidator.DEFAULT_SCOPE_VALIDATOR);
((OAuth2AuthorizationCodeRequestAuthenticationProvider) authenticationProvider)
.setAuthenticationValidator(authenticationValidator);
}
});
}
static class CustomRedirectUriValidator implements Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> {
@Override
public void accept(OAuth2AuthorizationCodeRequestAuthenticationContext authenticationContext) {
OAuth2AuthorizationCodeRequestAuthenticationToken authorizationCodeRequestAuthentication =
authenticationContext.getAuthentication();
RegisteredClient registeredClient = authenticationContext.getRegisteredClient();
String requestedRedirectUri = authorizationCodeRequestAuthentication.getRedirectUri();
// Use exact string matching when comparing client redirect URIs against pre-registered URIs
if (!registeredClient.getRedirectUris().contains(requestedRedirectUri)) {
OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.INVALID_REQUEST);
throw new OAuth2AuthorizationCodeRequestAuthenticationException(error, null);
}
}
}
OAuth2 设备授权端点
OAuth2DeviceAuthorizationEndpointConfigurer
提供自定义 OAuth2 设备授权端点 的功能。它定义了扩展点,让你可以自定义 OAuth2 设备授权请求的预处理、主处理和后处理逻辑。
OAuth2DeviceAuthorizationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.deviceAuthorizationEndpoint(deviceAuthorizationEndpoint ->
deviceAuthorizationEndpoint
.deviceAuthorizationRequestConverter(deviceAuthorizationRequestConverter) (1)
.deviceAuthorizationRequestConverters(deviceAuthorizationRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.deviceAuthorizationResponseHandler(deviceAuthorizationResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
.verificationUri("/oauth2/v1/device_verification") (7)
);
return http.build();
}
1 | deviceAuthorizationRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 提取 OAuth2 设备授权请求 到 OAuth2DeviceAuthorizationRequestAuthenticationToken 的实例。 |
2 | deviceAuthorizationRequestConverters() :设置 Consumer ,提供对 List 的访问,其中包含默认和(可选)添加的 AuthenticationConverter ,允许添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OAuth2DeviceAuthorizationRequestAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | deviceAuthorizationResponseHandler() :AuthenticationSuccessHandler (后处理器),用于处理“已验证”的 OAuth2DeviceAuthorizationRequestAuthenticationToken 并返回 OAuth2DeviceAuthorizationResponse。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应。 |
7 | verificationUri() :自定义最终用户验证页面的 URI ,用于将资源所有者定向到辅助设备。 |
OAuth2DeviceAuthorizationEndpointConfigurer
配置 OAuth2DeviceAuthorizationEndpointFilter
,并使用 OAuth2 授权服务器 SecurityFilterChain
@Bean
注册它。OAuth2DeviceAuthorizationEndpointFilter
是处理 OAuth2 设备授权请求的 Filter
。
OAuth2DeviceAuthorizationEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 一个OAuth2DeviceAuthorizationRequestAuthenticationConverter
。 -
AuthenticationManager
— 一个由OAuth2DeviceAuthorizationRequestAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 一个内部实现,用于处理“已验证”的OAuth2DeviceAuthorizationRequestAuthenticationToken
并返回OAuth2DeviceAuthorizationResponse
。 -
AuthenticationFailureHandler
— 一个OAuth2ErrorAuthenticationFailureHandler
。
OAuth2 设备验证端点
OAuth2DeviceVerificationEndpointConfigurer
提供自定义 OAuth2 设备验证端点(或“用户交互”)的功能。它定义了扩展点,让你可以自定义 OAuth2 设备验证请求的预处理、主处理和后处理逻辑。
OAuth2DeviceVerificationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.deviceVerificationEndpoint(deviceVerificationEndpoint ->
deviceVerificationEndpoint
.deviceVerificationRequestConverter(deviceVerificationRequestConverter) (1)
.deviceVerificationRequestConverters(deviceVerificationRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.deviceVerificationResponseHandler(deviceVerificationResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
.consentPage("/oauth2/v1/consent") (7)
);
return http.build();
}
1 | deviceVerificationRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于在尝试从 HttpServletRequest 中提取 OAuth2 设备验证请求(或同意)到 OAuth2DeviceVerificationAuthenticationToken 或 OAuth2DeviceAuthorizationConsentAuthenticationToken 的实例时使用。 |
2 | deviceVerificationRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问权限,允许添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OAuth2DeviceVerificationAuthenticationToken 或 OAuth2DeviceAuthorizationConsentAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | deviceVerificationResponseHandler() :AuthenticationSuccessHandler (后处理器),用于处理“已验证”的 OAuth2DeviceVerificationAuthenticationToken ,并指示资源所有者返回到其设备。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回错误响应。 |
7 | consentPage() :如果在设备验证请求流程期间需要同意,则重定向资源所有者的自定义同意页面的 URI 。 |
OAuth2DeviceVerificationEndpointConfigurer
配置 OAuth2DeviceVerificationEndpointFilter
,并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
。OAuth2DeviceVerificationEndpointFilter
是处理 OAuth2 设备验证请求(和同意)的 Filter
。
OAuth2DeviceVerificationEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 由OAuth2DeviceVerificationAuthenticationConverter
和OAuth2DeviceAuthorizationConsentAuthenticationConverter
组成的DelegatingAuthenticationConverter
。 -
AuthenticationManager
— 由OAuth2DeviceVerificationAuthenticationProvider
和OAuth2DeviceAuthorizationConsentAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 处理“已验证”的OAuth2DeviceVerificationAuthenticationToken
,并将用户重定向到成功页面(/?success
)的SimpleUrlAuthenticationSuccessHandler
。 -
AuthenticationFailureHandler
— 使用与OAuth2AuthenticationException
关联的OAuth2Error
,并返回OAuth2Error
响应的内部实现。
OAuth2 令牌端点
OAuth2TokenEndpointConfigurer
提供自定义 OAuth2 令牌端点 的能力。它定义了扩展点,让你可以自定义 OAuth2 访问令牌请求 的预处理、主处理和后处理逻辑。
OAuth2TokenEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.tokenEndpoint(tokenEndpoint ->
tokenEndpoint
.accessTokenRequestConverter(accessTokenRequestConverter) (1)
.accessTokenRequestConverters(accessTokenRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.accessTokenResponseHandler(accessTokenResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
);
return http.build();
}
1 | accessTokenRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于在尝试从 HttpServletRequest 中提取 OAuth2 访问令牌请求 到 OAuth2AuthorizationGrantAuthenticationToken 的实例时使用。 |
2 | accessTokenRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问权限,允许添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OAuth2AuthorizationGrantAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | accessTokenResponseHandler() :用于处理 OAuth2AccessTokenAuthenticationToken 并返回 OAuth2AccessTokenResponse 的 AuthenticationSuccessHandler (后处理器)。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应。 |
OAuth2TokenEndpointConfigurer
配置 OAuth2TokenEndpointFilter
,并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
。OAuth2TokenEndpointFilter
是处理 OAuth2 访问令牌请求的 Filter
。
受支持的 授权授予类型 为 authorization_code
、refresh_token
、client_credentials
、urn:ietf:params:oauth:grant-type:device_code
和 urn:ietf:params:oauth:grant-type:token-exchange
。
OAuth2TokenEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 由OAuth2AuthorizationCodeAuthenticationConverter
、OAuth2RefreshTokenAuthenticationConverter
、OAuth2ClientCredentialsAuthenticationConverter
、OAuth2DeviceCodeAuthenticationConverter
和OAuth2TokenExchangeAuthenticationConverter
组成的DelegatingAuthenticationConverter
。 -
AuthenticationManager
— 由OAuth2AuthorizationCodeAuthenticationProvider
、OAuth2RefreshTokenAuthenticationProvider
、OAuth2ClientCredentialsAuthenticationProvider
、OAuth2DeviceCodeAuthenticationProvider
和OAuth2TokenExchangeAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
—OAuth2AccessTokenResponseAuthenticationSuccessHandler
。 -
AuthenticationFailureHandler
— 一个OAuth2ErrorAuthenticationFailureHandler
。
自定义客户端凭据授予请求验证
OAuth2ClientCredentialsAuthenticationValidator
是用于验证特定 OAuth2 客户端凭据授予请求参数的默认验证器。默认实现验证 scope
参数。如果验证失败,则会抛出 OAuth2AuthenticationException
。
OAuth2ClientCredentialsAuthenticationProvider
提供了通过向 setAuthenticationValidator()
提供类型为 Consumer<OAuth2ClientCredentialsAuthenticationContext>
的自定义身份验证验证器来覆盖默认请求验证的功能。
OAuth2ClientCredentialsAuthenticationContext 持有 OAuth2ClientCredentialsAuthenticationToken ,其中包含 OAuth2 客户端凭据授予请求参数。
|
如果验证失败,身份验证验证器必须抛出 OAuth2AuthenticationException 。
|
以下示例展示了如何使用覆盖默认 scope
验证的自定义身份验证验证器来配置 OAuth2ClientCredentialsAuthenticationProvider
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.tokenEndpoint(tokenEndpoint ->
tokenEndpoint
.authenticationProviders(configureAuthenticationValidator())
);
return http.build();
}
private Consumer<List<AuthenticationProvider>> configureAuthenticationValidator() {
return (authenticationProviders) ->
authenticationProviders.forEach((authenticationProvider) -> {
if (authenticationProvider instanceof OAuth2ClientCredentialsAuthenticationProvider) {
Consumer<OAuth2ClientCredentialsAuthenticationContext> authenticationValidator =
new CustomScopeValidator();
// Override default scope validation
((OAuth2ClientCredentialsAuthenticationProvider) authenticationProvider)
.setAuthenticationValidator(authenticationValidator);
}
});
}
static class CustomScopeValidator implements Consumer<OAuth2ClientCredentialsAuthenticationContext> {
@Override
public void accept(OAuth2ClientCredentialsAuthenticationContext authenticationContext) {
OAuth2ClientCredentialsAuthenticationToken clientCredentialsAuthentication =
authenticationContext.getAuthentication();
Set<String> requestedScopes = clientCredentialsAuthentication.getScopes();
RegisteredClient registeredClient = authenticationContext.getRegisteredClient();
Set<String> allowedScopes = registeredClient.getScopes();
// TODO Implement scope validation
}
}
OAuth2 令牌自省端点
OAuth2TokenIntrospectionEndpointConfigurer
提供自定义 OAuth2 Token Introspection 端点 的功能。它定义了扩展点,让你可以自定义 OAuth2 introspection 请求 的预处理、主处理和后处理逻辑。
OAuth2TokenIntrospectionEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint ->
tokenIntrospectionEndpoint
.introspectionRequestConverter(introspectionRequestConverter) (1)
.introspectionRequestConverters(introspectionRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.introspectionResponseHandler(introspectionResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
);
return http.build();
}
1 | introspectionRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 提取一个 OAuth2 introspection 请求 到 OAuth2TokenIntrospectionAuthenticationToken 的实例。 |
2 | introspectionRequestConverters() :设置 Consumer ,提供对 List 的访问,其中包含默认的和(可选)添加的 AuthenticationConverter ,允许添加、移除或自定义一个特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OAuth2TokenIntrospectionAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | introspectionResponseHandler() :用于处理“已验证”OAuth2TokenIntrospectionAuthenticationToken 并返回 OAuth2TokenIntrospection 响应 的 AuthenticationSuccessHandler (后处理器)。 |
6 | errorResponseHandler() :用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应 的 AuthenticationFailureHandler (后处理器)。 |
OAuth2TokenIntrospectionEndpointConfigurer
配置 OAuth2TokenIntrospectionEndpointFilter
并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
。OAuth2TokenIntrospectionEndpointFilter
是处理 OAuth2 introspection 请求的 Filter
。
OAuth2TokenIntrospectionEndpointFilter
配置有以下默认值
-
AuthenticationConverter
— 一个OAuth2TokenIntrospectionAuthenticationConverter
。 -
AuthenticationManager
— 一个由OAuth2TokenIntrospectionAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 一个内部实现,用于处理“已验证”OAuth2TokenIntrospectionAuthenticationToken
并返回OAuth2TokenIntrospection
响应。 -
AuthenticationFailureHandler
— 一个OAuth2ErrorAuthenticationFailureHandler
。
OAuth2 Token Revocation 端点
OAuth2TokenRevocationEndpointConfigurer
提供自定义 OAuth2 Token Revocation 端点 的功能。它定义了扩展点,让你可以自定义 OAuth2 revocation 请求 的预处理、主处理和后处理逻辑。
OAuth2TokenRevocationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.tokenRevocationEndpoint(tokenRevocationEndpoint ->
tokenRevocationEndpoint
.revocationRequestConverter(revocationRequestConverter) (1)
.revocationRequestConverters(revocationRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.revocationResponseHandler(revocationResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
);
return http.build();
}
1 | revocationRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 中提取 OAuth2 吊销请求 到 OAuth2TokenRevocationAuthenticationToken 的实例。 |
2 | revocationRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问,允许添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OAuth2TokenRevocationAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | revocationResponseHandler() :AuthenticationSuccessHandler (后处理器),用于处理“已验证”的 OAuth2TokenRevocationAuthenticationToken 并返回 OAuth2 吊销响应。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应。 |
OAuth2TokenRevocationEndpointConfigurer
配置 OAuth2TokenRevocationEndpointFilter
并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
。OAuth2TokenRevocationEndpointFilter
是处理 OAuth2 吊销请求的 Filter
。
OAuth2TokenRevocationEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 一个OAuth2TokenRevocationAuthenticationConverter
。 -
AuthenticationManager
— 一个由OAuth2TokenRevocationAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 一个内部实现,用于处理“已验证”的OAuth2TokenRevocationAuthenticationToken
并返回 OAuth2 吊销响应。 -
AuthenticationFailureHandler
— 一个OAuth2ErrorAuthenticationFailureHandler
。
OAuth2 授权服务器元数据端点
OAuth2AuthorizationServerMetadataEndpointConfigurer
提供了自定义 OAuth2 授权服务器元数据端点 的功能。它定义了一个扩展点,允许您自定义 OAuth2 授权服务器元数据响应。
OAuth2AuthorizationServerMetadataEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.authorizationServerMetadataEndpoint(authorizationServerMetadataEndpoint ->
authorizationServerMetadataEndpoint
.authorizationServerMetadataCustomizer(authorizationServerMetadataCustomizer)); (1)
return http.build();
}
1 | authorizationServerMetadataCustomizer() :Consumer ,提供对 OAuth2AuthorizationServerMetadata.Builder 的访问,允许自定义授权服务器配置的声明。 |
OAuth2AuthorizationServerMetadataEndpointConfigurer
配置 OAuth2AuthorizationServerMetadataEndpointFilter
并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
。OAuth2AuthorizationServerMetadataEndpointFilter
是返回 OAuth2AuthorizationServerMetadata 响应 的 Filter
。
OpenID Connect 1.0 提供程序配置端点
OidcProviderConfigurationEndpointConfigurer
提供了自定义 OpenID Connect 1.0 提供程序配置端点 的功能。它定义了一个扩展点,允许你自定义 OpenID 提供程序配置响应。
OidcProviderConfigurationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.oidc(oidc ->
oidc
.providerConfigurationEndpoint(providerConfigurationEndpoint ->
providerConfigurationEndpoint
.providerConfigurationCustomizer(providerConfigurationCustomizer) (1)
)
);
return http.build();
}
1 | providerConfigurationCustomizer() :提供对 OidcProviderConfiguration.Builder 的访问权限的 Consumer ,允许自定义 OpenID 提供程序配置的声明。 |
OidcProviderConfigurationEndpointConfigurer
配置 OidcProviderConfigurationEndpointFilter
并通过 OAuth2 授权服务器 SecurityFilterChain
@Bean
注册它。OidcProviderConfigurationEndpointFilter
是返回 OidcProviderConfiguration 响应 的 Filter
。
OpenID Connect 1.0 注销端点
OidcLogoutEndpointConfigurer
提供了自定义 OpenID Connect 1.0 注销端点 的功能。它定义了扩展点,允许你自定义 RP 发起的注销请求的预处理、主处理和后处理逻辑。
OidcLogoutEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.oidc(oidc ->
oidc
.logoutEndpoint(logoutEndpoint ->
logoutEndpoint
.logoutRequestConverter(logoutRequestConverter) (1)
.logoutRequestConverters(logoutRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.logoutResponseHandler(logoutResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
)
);
return http.build();
}
1 | logoutRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 中提取 注销请求 到 OidcLogoutAuthenticationToken 的实例。 |
2 | logoutRequestConverters() :设置提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问权限的 Consumer ,允许添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OidcLogoutAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | logoutResponseHandler() :用于处理“已验证”的 OidcLogoutAuthenticationToken 和执行注销的 AuthenticationSuccessHandler (后处理器)。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回错误响应。 |
OidcLogoutEndpointConfigurer
配置 OidcLogoutEndpointFilter
并通过 OAuth2 授权服务器 SecurityFilterChain
@Bean
注册它。OidcLogoutEndpointFilter
是处理 RP 发起的注销请求 并执行最终用户注销的 Filter
。
OidcLogoutEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 一个OidcLogoutAuthenticationConverter
。 -
AuthenticationManager
— 一个由OidcLogoutAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 一个内部实现,用于处理“已认证”的OidcLogoutAuthenticationToken
并执行注销。 -
AuthenticationFailureHandler
— 使用与OAuth2AuthenticationException
关联的OAuth2Error
,并返回OAuth2Error
响应的内部实现。
OidcLogoutAuthenticationProvider 使用 SessionRegistry 查找与请求注销的最终用户关联的 SessionInformation 实例。
|
OidcClientInitiatedLogoutSuccessHandler 是 Spring Security 的 OAuth2 客户端支持中用于配置 OpenID Connect 1.0 RP 发起的注销 的相应配置。
|
OpenID Connect 1.0 UserInfo 端点
OidcUserInfoEndpointConfigurer
提供了自定义 OpenID Connect 1.0 UserInfo 端点 的能力。它定义了扩展点,让你可以自定义 UserInfo 请求 的预处理、主处理和后处理逻辑。
OidcUserInfoEndpointConfigurer
提供了以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.oidc(oidc ->
oidc
.userInfoEndpoint(userInfoEndpoint ->
userInfoEndpoint
.userInfoRequestConverter(userInfoRequestConverter) (1)
.userInfoRequestConverters(userInfoRequestConvertersConsumer) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.userInfoResponseHandler(userInfoResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
.userInfoMapper(userInfoMapper) (7)
)
);
return http.build();
}
1 | userInfoRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 中提取 UserInfo 请求 到 OidcUserInfoAuthenticationToken 的实例。 |
2 | userInfoRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OidcUserInfoAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | userInfoResponseHandler() :AuthenticationSuccessHandler (后处理器),用于处理“已认证”的 OidcUserInfoAuthenticationToken 并返回 UserInfo 响应。 |
6 | errorResponseHandler() :AuthenticationFailureHandler (后处理器),用于处理 OAuth2AuthenticationException 并返回 UserInfo 错误响应。 |
7 | userInfoMapper() :Function ,用于从 OidcUserInfoAuthenticationContext 中提取声明到 OidcUserInfo 的实例。 |
OidcUserInfoEndpointConfigurer
配置 OidcUserInfoEndpointFilter
并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
中。OidcUserInfoEndpointFilter
是处理 UserInfo 请求 并返回 OidcUserInfo 响应 的 Filter
。
OidcUserInfoEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 从SecurityContext
获取Authentication
并使用主体创建一个OidcUserInfoAuthenticationToken
的内部实现。 -
AuthenticationManager
— 由OidcUserInfoAuthenticationProvider
组成的AuthenticationManager
,它与userInfoMapper
的内部实现相关联,该实现从 标准声明 中提取 ID 令牌,具体取决于授权期间 请求的范围。 -
AuthenticationSuccessHandler
— 处理“已验证”OidcUserInfoAuthenticationToken
并返回OidcUserInfo
响应的内部实现。 -
AuthenticationFailureHandler
— 使用与OAuth2AuthenticationException
关联的OAuth2Error
,并返回OAuth2Error
响应的内部实现。
您可以通过提供 OAuth2TokenCustomizer<JwtEncodingContext> @Bean 来自定义 ID 令牌。
|
OpenID Connect 1.0 UserInfo 端点是一个 OAuth2 受保护资源,需要在 UserInfo 请求 中将访问令牌作为持有者令牌发送。以下示例展示了如何启用 OAuth2 资源服务器配置
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
...
http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(Customizer.withDefaults()));
return http.build();
}
@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
OpenID Connect 1.0 UserInfo 端点需要一个 JwtDecoder @Bean 。
|
指南 操作方法:自定义 OpenID Connect 1.0 UserInfo 响应 包含自定义 UserInfo 端点的示例。 |
OpenID Connect 1.0 客户端注册端点
OidcClientRegistrationEndpointConfigurer
提供了自定义 OpenID Connect 1.0 客户端注册端点 的功能。它定义了扩展点,让您可以自定义 客户端注册请求 或 客户端读取请求 的预处理、主处理和后处理逻辑。
OidcClientRegistrationEndpointConfigurer
提供以下配置选项
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
authorizationServerConfigurer
.oidc(oidc ->
oidc
.clientRegistrationEndpoint(clientRegistrationEndpoint ->
clientRegistrationEndpoint
.clientRegistrationRequestConverter(clientRegistrationRequestConverter) (1)
.clientRegistrationRequestConverters(clientRegistrationRequestConvertersConsumers) (2)
.authenticationProvider(authenticationProvider) (3)
.authenticationProviders(authenticationProvidersConsumer) (4)
.clientRegistrationResponseHandler(clientRegistrationResponseHandler) (5)
.errorResponseHandler(errorResponseHandler) (6)
)
);
return http.build();
}
1 | clientRegistrationRequestConverter() :添加一个 AuthenticationConverter (预处理器),用于尝试从 HttpServletRequest 中提取 客户端注册请求 或 客户端读取请求 到 OidcClientRegistrationAuthenticationToken 的实例。 |
2 | clientRegistrationRequestConverters() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter 的 List 的访问权限,从而能够添加、删除或自定义特定的 AuthenticationConverter 。 |
3 | authenticationProvider() :添加一个 AuthenticationProvider (主处理器),用于对 OidcClientRegistrationAuthenticationToken 进行身份验证。 |
4 | authenticationProviders() :设置 Consumer ,提供对默认和(可选)添加的 AuthenticationProvider 的 List 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider 。 |
5 | clientRegistrationResponseHandler() :用于处理“已验证”OidcClientRegistrationAuthenticationToken 并返回 客户端注册响应 或 客户端读取响应 的 AuthenticationSuccessHandler (后处理器)。 |
6 | errorResponseHandler() :用于处理 OAuth2AuthenticationException 并返回 客户端注册错误响应 或 客户端读取错误响应 的 AuthenticationFailureHandler (后置处理器)。 |
默认情况下,OpenID Connect 1.0 客户端注册端点处于禁用状态,因为很多部署不需要动态客户端注册。 |
OidcClientRegistrationEndpointConfigurer
配置 OidcClientRegistrationEndpointFilter
并将其注册到 OAuth2 授权服务器 SecurityFilterChain
@Bean
中。OidcClientRegistrationEndpointFilter
是处理 客户端注册请求 并返回 OidcClientRegistration 响应 的 Filter
。
OidcClientRegistrationEndpointFilter 还处理 客户端读取请求 并返回 OidcClientRegistration 响应。
|
OidcClientRegistrationEndpointFilter
配置了以下默认值
-
AuthenticationConverter
— 一个OidcClientRegistrationAuthenticationConverter
。 -
AuthenticationManager
— 一个由OidcClientRegistrationAuthenticationProvider
和OidcClientConfigurationAuthenticationProvider
组成的AuthenticationManager
。 -
AuthenticationSuccessHandler
— 一个内部实现,用于处理“经过验证的”OidcClientRegistrationAuthenticationToken
并返回OidcClientRegistration
响应。 -
AuthenticationFailureHandler
— 使用与OAuth2AuthenticationException
关联的OAuth2Error
,并返回OAuth2Error
响应的内部实现。
OpenID Connect 1.0 客户端注册端点是一个 OAuth2 受保护资源,需要在客户端注册(或客户端读取)请求中将访问令牌作为承载令牌发送。
客户端注册请求中的访问令牌需要OAuth2 作用域 client.create 。
|
客户端读取请求中的访问令牌需要OAuth2 作用域 client.read 。
|
以下示例展示了如何启用 OAuth2 资源服务器配置
@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
new OAuth2AuthorizationServerConfigurer();
http.apply(authorizationServerConfigurer);
...
http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(Customizer.withDefaults()));
return http.build();
}
@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
OpenID Connect 1.0 客户端注册端点需要一个 JwtDecoder @Bean 。
|