Spring Security OAuth2
主要提供 4
个模块,其中 spring-security-oauth2-client
提供 OAuth2 Client
的实现,本文主要了解一些核心组件和部分内置 Filter
@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:维护 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:维护 OAuth2AuthorizedClient 即 ClientRegistration
* 关联 AccessToken 等信息
* Spring Boot 默认注册 InMemoryOAuth2AuthorizedClientService,即基于内存管理
*/
@Bean
@ConditionalOnMissingBean
OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {
return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);
}
OAuth2AuthorizedClientService
主要维护 OAuth2AuthorizedClient
信息,即 ClientRegistration
即对应的 AccessToken
等信息Spring Boot
默认装配 InMemoryOAuth2AuthorizedClientService
/**
* 跟 OAuth2AuthorizedClientService 类似,主要是在 Request 之间维护未认证的 OAuth2AuthorizedClient
* Spring Boot 默认注册 AuthenticatedPrincipalOAuth2AuthorizedClientRepository
*/
@Bean
@ConditionalOnMissingBean
OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {
return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);
}
OAuth2AuthorizedClientRepository
主要维护未认证的 OAuth2AuthorizedClient
Spring Boot
默认装配 AuthenticatedPrincipalOAuth2AuthorizedClientRepository
Spring Boot
自动装配类提供的实例,我们也可以自行覆盖Client
信息并不多且生命周期较短,可以基于 内存
维护 @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
@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
实例