UserDetailsService는 DaoAuthenticationProvider에서 사용자 이름과 비밀번호를 사용하여 인증할 때, 사용자 이름, 비밀번호, 그리고 기타 속성을 가져오기 위해 사용됩니다. Spring Security는 메모리 내 저장, JDBC, 그리고 캐싱을 포함한 다양한 UserDetailsService 구현체를 제공합니다.
사용자 정의 인증을 설정하려면, 커스텀 UserDetailsService를 빈(bean)으로 등록하여 사용할 수 있습니다. 예를 들어, CustomUserDetailsService가 UserDetailsService를 구현했다고 가정할 때, 다음 코드처럼 인증을 커스터마이징할 수 있습니다:
이 방식은 AuthenticationManagerBuilder가 설정되지 않았고, AuthenticationProviderBean이 정의되지 않은 경우에만 사용됩니다.
@Bean
CustomUserDetailsService customUserDetailsService() {
return new CustomUserDetailsService();
}
이 부분은 Spring Security에서 UserDetailsService를 커스텀할 때의 조건을 설명하는 내용입니다. 설명하자면:
AuthenticationManagerBuilder 설정: AuthenticationManagerBuilder는 Spring Security에서 인증 설정을 관리하는 중요한 구성 요소입니다. 여기서 인증 방식을 설정할 수 있으며, UserDetailsService와 같은 인증 관련 빈(Bean)을 등록할 수도 있습니다. 만약 AuthenticationManagerBuilder에 특정 설정이 이미 존재한다면, Spring은 기본적으로 그 설정을 우선시하게 됩니다.
AuthenticationProviderBean 정의 여부: AuthenticationProvider는 실제 인증 작업을 처리하는 컴포넌트입니다. DaoAuthenticationProvider가 그중 하나로, UserDetailsService를 사용하여 사용자 정보를 확인하고 비밀번호를 검증합니다. 만약 AuthenticationProviderBean이 이미 등록되어 있다면, Spring Security는 별도로 정의된 UserDetailsService 빈을 사용하지 않고, 등록된 AuthenticationProvider를 그대로 사용합니다.
요약하자면:
이 조건은 Spring Security가 이미 AuthenticationManagerBuilder 또는 AuthenticationProvider와 관련된 설정이 있을 때, 우리가 별도로 정의한 UserDetailsService 빈을 무시한다는 의미입니다. 반대로, AuthenticationManagerBuilder나 AuthenticationProviderBean이 따로 정의되어 있지 않은 경우에만 커스텀 UserDetailsService 빈이 사용된다는 뜻입니다.
PasswordEncoder는 Spring Security의 서블릿 지원 기능 중 하나로, 비밀번호를 안전하게 저장하는 데 사용됩니다. Spring Security에서는 PasswordEncoder Bean을 노출시켜 PasswordEncoder 구현을 사용자 정의할 수 있습니다.