AuthenticationManager (보통 ProviderManager의 인스턴스)는 등록된 AuthenticationProvider들을 순회하며 인증 시도 일반적인 Spring Security 구성에서는 DaoAuthenticationProvider가 사용되며, 이는 UserDetailsService를 통해 사용자 정보를 불러와 제출된 인증 정보와 비교 따라서, 사용자 정보의 데이터베이스 비교 로직을 찾고자 한다면 UserDetailsService 구현 확인 필요 UserDetailsService는 보통 loadUserByUsername 메서드를 구현하여, 제공된 사용자명 (이 경우 username)을 사용해 데이터베이스에서 사용자 정보를 조회하고, 이 정보를 기반으로 UserDetails 객체를 생성 후 반환
@Service
@RequiredArgsConstructor
public class CustomUserDetailServiceImpl implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String username) {
Member member = memberRepository.selectMember(username);
return User.withUsername(member.getEmail())
.password("{noop}"+member.getPassword())
.roles(String.valueOf(member.getMemberAuth()))
.build();
}
}
public interface CustomUserDetailService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
Config파일 수정
private final AuthenticationConfiguration authenticationConfiguration;
public SecurityConfig(final AuthenticationConfiguration authenticationConfiguration) {
this.authenticationConfiguration = authenticationConfiguration;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 추가된 코드
//AuthenticationManagerBuilder sharedObject = http.getSharedObject(AuthenticationManagerBuilder.class);
//AuthenticationManager authenticationManager = sharedObject.build();
AuthenticationManager authenticationManager = authenticationConfiguration.getAuthenticationManager();
http.authenticationManager(authenticationManager);
http
.csrf(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(authorizeRequest ->
authorizeRequest
.requestMatchers(new AntPathRequestMatcher("/login")).authenticated()
.requestMatchers(new AntPathRequestMatcher("/h2/**")).permitAll()
)
// 추가된 코드 (필터 변경하기)
.addFilterAt(
this.abstractAuthenticationProcessingFilter(authenticationManager),
UsernamePasswordAuthenticationFilter.class).headers(
headersConfigurer -> headersConfigurer.frameOptions(
HeadersConfigurer.FrameOptionsConfig::sameOrigin
).contentSecurityPolicy( policyConfig ->
policyConfig.policyDirectives(
"script-src 'self'; img-src 'self'; font-src 'self' data:; default-src 'self'; frame-src 'self'"
)
)
);
return http.build();
}
// 앞서 생성한 로그인 필터 호출
public AbstractAuthenticationProcessingFilter abstractAuthenticationProcessingFilter(
final AuthenticationManager authenticationManager) {
return new LoginAuthenticationFilter("/login", authenticationManager); // "/login"에 접속했을 때
}