自定义 Spring Authorization Server 配置

Spring OAuthorization Server 自定义配置非常重要,后面的所有定制配置都是基于此。本文先介绍 OAuth2AuthorizationServerConfigurer 提供的配置选项,并使用 Provider Settings 和 Client Authentication 作为例子。

OAuth2AuthorizationServerConfigurer 提供了为 OAuth2 授权服务器完全自定义安全配置的能力。它允许您指定要使用的核心组件——例如,RegisteredClientRepositoryOAuth2AuthorizationServiceOAuth2TokenGenerator等。此外,它还允许为协议端点自定义请求处理逻辑——例如,授权端点、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_basicclient_secret_postprivate_key_jwtclient_secret_jwtnone(公共客户端)。

OAuth2ClientAuthenticationFilter 配置了以下默认值:

  • AuthenticationConverter — 一个由 JwtClientAssertionAuthenticationConverterClientSecretBasicAuthenticationConverterClientSecretPostAuthenticationConverterPublicClientAuthenticationConverter 组成的 DelegatingAuthenticationConverter
  • AuthenticationManager — 由 JwtClientAssertionAuthenticationProviderClientSecretAuthenticationProviderPublicClientAuthenticationProvider 组成的 AuthenticationManager
  • AuthenticationSuccessHandler — 将“已认证”的 OAuth2ClientAuthenticationToken (当前的 Authentication)与 SecurityContext 关联的内部实现。
  • AuthenticationFailureHandler — 使用与 OAuth2AuthenticationException 关联的 OAuth2Error 返回 OAuth2 错误响应的内部实现。

项目实战

Spring Authorization Server 实战项目:

posted @   ZnPi  阅读(3245)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示