当前位置: 首页 > 工具软件 > OAuth2client > 使用案例 >

Spring Security OAuth2 Client 的一些核心组件和内置 Filter

广楚
2023-12-01

前言

Spring Security OAuth2 主要提供 4 个模块,其中 spring-security-oauth2-client 提供 OAuth2 Client 的实现,本文主要了解一些核心组件和部分内置 Filter

核心组件

SecurityFilterChain

	@Bean
	SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception {
		// 所有请求需要认证
		http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
		// 开启 oauth2login
		http.oauth2Login(Customizer.withDefaults());
		// 声明为 oauth2 client
		http.oauth2Client();
		return http.build();
	}
  • SecurityFilterChainSpring Security 本身的组件
  • 此处是 Spring Boot 自动装配类提供的默认实例,其中
    • oauth2Login 是开启 oauth2Login 模式
    • oauth2Client 声明为 OAuth2 Client,引入对应组件

ClientRegistrationRepository

	/**
	 * ClientRegistrationRepository:维护 ClientRegistration 客户端注册信息
	 * Spring Boot 默认提供一个 InMemoryClientRegistrationRepository,可以把配置
	 * 		文件里的 ClientRegistration 注册到内存中
	 */
	@Bean
	@ConditionalOnMissingBean(ClientRegistrationRepository.class)
	InMemoryClientRegistrationRepository clientRegistrationRepository(OAuth2ClientProperties properties) {
		List<ClientRegistration> registrations = new ArrayList<>(
				OAuth2ClientPropertiesRegistrationAdapter.getClientRegistrations(properties).values());
		return new InMemoryClientRegistrationRepository(registrations);
	}
  • ClientRegistrationRepository,维护 ClientRegistration,即 客户端 注册信息
  • 示例是 Spring Boot 的自动装配,会默认注册一个 InMemoryClientRegistrationRepository 把配置文件里的 ClientRegistration 也注册进去

OAuth2AuthorizedClientService

	/**
	 * OAuth2AuthorizedClientService:维护 OAuth2AuthorizedClient 即 ClientRegistration
	 * 		关联 AccessToken 等信息
	 * Spring Boot 默认注册 InMemoryOAuth2AuthorizedClientService,即基于内存管理
	 */
	@Bean
	@ConditionalOnMissingBean
	OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {
		return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);
	}
  • OAuth2AuthorizedClientService 主要维护 OAuth2AuthorizedClient 信息,即 ClientRegistration 即对应的 AccessToken 等信息
  • Spring Boot 默认装配 InMemoryOAuth2AuthorizedClientService

OAuth2AuthorizedClientRepository

	/**
	 * 跟 OAuth2AuthorizedClientService 类似,主要是在 Request 之间维护未认证的 OAuth2AuthorizedClient
	 * Spring Boot 默认注册 AuthenticatedPrincipalOAuth2AuthorizedClientRepository
	 */
	@Bean
	@ConditionalOnMissingBean
	OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {
		return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);
	}
  • OAuth2AuthorizedClientRepository 主要维护未认证的 OAuth2AuthorizedClient
  • Spring Boot 默认装配 AuthenticatedPrincipalOAuth2AuthorizedClientRepository

小结

  • 以上都是 Spring Boot 自动装配类提供的实例,我们也可以自行覆盖
  • 一般情况下,这些组件可以直接使用,因为 Client 信息并不多且生命周期较短,可以基于 内存 维护

内置 Filter

OAuth2AuthorizationRequestRedirectFilter

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		try {
			/**
			 * 将 /oauth2/authorization 路径请求解析转发给 认证中心,对应的请求:/oauth2/authorize
			 */
			OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver.resolve(request);
			if (authorizationRequest != null) {
				this.sendRedirectForAuthorization(request, response, authorizationRequest);
				return;
			}
		}
		
		// ...
		
	}
  • 该过滤器处理 /oauth2/authorization 路径,主要场景是默认或手动配置的 oauth2login 路径
  • 它会将上述路径处理转发给 认证中心 对应的路径 /oauth2/authorize

OAuth2AuthorizationCodeGrantFilter

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		/**
		 * 处理授权码回调请求处理,比如:
		 * 		重定向到客户端回调地址
		 * 	    创建对应的 OAuth2AuthorizedClient
		 * 	    等
		 */
		if (matchesAuthorizationResponse(request)) {
			processAuthorizationResponse(request, response);
			return;
		}
		filterChain.doFilter(request, response);
	}
  • 该过滤器负责处理 认证中心 的授权码回调请求,主要场景就是 认证中心 生成授权码后的回调请求
  • 这里会进行诸如 回调地址重定向OAuth2AuthorizedClient 的创建等处理

其他

还有其他内置 Filter 就不一一了解了,比如:

  • OAuth2LoginAuthenticationFilter 处理 /login/oauth2/code/* 路径,默认的授权码回调路径,此过滤器会向 认证中心 请求对应的 Token 信息

总结

依赖于强大的 Spring Boot,我们仅需引入 spring-boot-starter-oauth2-client 即可装配上述组件,且这些组件大都不需要自行覆盖,通常我们只需提供一个 SecurityFilterChain 实例

完整 demo 示例

 类似资料: