При использовании аутентификации на основе сертификатов AbstractPreAuthenticatedProcessingFilter
будет отвечать за аутентификацию клиента.Во-первых, фильтр извлекает клиента через X509AuthenticationFilter
.После этого создается токен аутентификации с использованием сертификата CN в качестве принципала и сертификата DN в качестве учетных данных.Реализация AuthenticationManager
, которая будет выполнять аутентификацию этого токена, - PreAuthenticatedAuthenticationProvider
, которая будет использовать вашу реализацию UserDetailsService
для аутентификации клиента.
Вы можете включить аутентификацию сертификата, добавив его в HttpConfigurer,и настройте собственную реализацию UserDetailsService
.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.x509()
.subjectPrincipalRegex("CN=(.*?)")
.userDetailsService(userDetailsService());
}
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<User> user = userRepository.findByUsername(username);
if(user.isPresent()){
return new User(username, userCredentials, new Role("ROLE_USER"));
}
throw new UsernameNotFoundException("User" + username + "does not exist");
}
};
}
Здесь у вас есть пример аутентификации сертификата x509.