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
主要维护未认证的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
实例
版权声明:本文为weixin_42189048原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。