Spring Security OAuth2 Client 的一些核心组件和内置 Filter
前言
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();
}
SecurityFilterChain是Spring 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主要维护未认证的OAuth2AuthorizedClientSpring 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 实例
版权声明:本文为weixin_42189048原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。