ClientRegistrationRepository stores and retrieves the ClientRegistration objects an OAuth 2 client needs. Define it as a Spring bean when property-based configuration cannot provide enough flexibility, such as dynamic credentials or conditional provider access. section 16.1.4 section 16.2
Build a custom repository by:
- Injecting credential values or other configuration. section 16.1.4
- Creating a ClientRegistration with credentials, redirect or token endpoints, scopes, and grant settings as needed. section 16.1.4 section 16.2
- Returning an InMemoryClientRegistrationRepository or implementing the contract against a database, vault, or endpoint. section 16.1.4
In-memory registration
Expose a ClientRegistrationRepository bean that returns an InMemoryClientRegistrationRepository containing a Google registration. Spring Security then uses the bean to obtain client registration details for OAuth 2 login.
Listing 16.5 Implementing custom logic
@Configuration
public class SecurityConfig {
@Value("${client-id}")
private String clientId; #1
@Value("${client-secret}")
private String clientSecret; #1
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http)
throws Exception {
http.oauth2Login(Customizer.withDefaults());
http.authorizeHttpRequests(
c -> c.anyRequest().authenticated()
);
return http.build();
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(
this.googleClientRegistration()); #2
}
private ClientRegistration googleClientRegistration() {
return CommonOAuth2Provider.GOOGLE.getBuilder("google") #3
.clientId(clientId)
.clientSecret(clientSecret)
.build();
}
}
Inspect the annotated configuration showing property injection, registration construction, and repository exposure as a Spring bean. section 16.1.4
