AuthenticationProvider
• 사용자의 자격 증명을 확인하고 인증 과정을 관리하는 클래스로서 사용자가 시스템에 액세스하기 위해
제공한 정보(예: 아이디와 비밀번호)가 유효한지 검증하는 과정을 포함한다
• 다양한 유형의 인증 메커니즘을 지원할 수 있는데,
예를 들어 표준 사용자 이름과 비밀번호를 기반으로 한 인증, 토큰 기반 인증, 지문 인식 등을 처리할 수 있다.
• 성공적인 인증 후에는 Authentication 객체를 반환하며 이 객체에는 사용자의 신원 정보와 인증된 자격 증명을 포함한다
• 인증 과정 중에 문제가 발생한 경우 AuthenticationException 과 같은 예외를 발생시켜 문제를 알리는 역할을 한다
AuthenticationProvider 흐름도
AuthenticationProvider 사용 방법 - 일반 객체로 생성
일반 객체 [== POJO객체 , Spring Bean이 아님 ]
AuthenticationManagerBuilder를 이용해서 AuthenticationProvider를 등록하는것과
HttpSecurity를 이용해서 AuthenticationProvider를 등록하는것은 같다.
원하는 방법을 사용한다.
[anonymousAuthenticationProvider는 spring이 알아서 추가해준 provider, parent ProviderManger 또한 그렇다. ]
AuthenticationProvider 사용 방법 - 빈으로 생성
1. AuthenticationProvider 빈을 한개만 정의했을경우
AuthenticationProvider를 빈으로 정의하면 DaoAuthenticationProvder를 자동으로 대체하게 된다
@Bean
public AuthenticationProvider customAuthenticationProvider(){
return new CustomAuthenticationProvider();
}
DaoAuthenticationProvder가 있던 자리에 CustomAuthenticationProvider로 대체된것을 확인할 수 있다.
DaoAuthenticationProvder가 사라지지않게끔 Provider를 추가하려면 아래와 같이 진행한다.
[아래 코드를 추가해야한다, 위 코드도 있어야하고 ]
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, AuthenticationManagerBuilder builder, AuthenticationConfiguration configuration)
throws Exception {
AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
managerBuilder.authenticationProvider(customAuthenticationProvider());
ProviderManager providerManager = (ProviderManager)configuration.getAuthenticationManager();
providerManager.getProviders().remove(0);
builder.authenticationProvider(new DaoAuthenticationProvider());
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
return http.build();
}
AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
managerBuilder.authenticationProvider(customAuthenticationProvider());
AuthenticationManagerBuilder가 만든 ProviderManager(=AuthenticationManager)는 @6958 객체이므로
거기 Providers에 추가된다.
ProviderManager providerManager = (ProviderManager)configuration.getAuthenticationManager();
providerManager.getProviders().remove(0);
builder.authenticationProvider(new DaoAuthenticationProvider());
AuthenticationConfiguration의 ProviderManager는 @8336이다.
거기서 첫번째 Provider [ CustomAuthenticationProvider] 를 삭제해준다.
그리고 AuthenticationManagerBuilder의 ProviderManager에 Dao~Provider를 추가한다.
[ AuthenticationManagerBuilder의 Provider또한 @8336이다.]
그러면 위와 같은 결과가 된다.
2. 빈을 두 개 이상 정의 할 경우
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
managerBuilder.authenticationProvider(customAuthenticationProvider());
managerBuilder.authenticationProvider(customAuthenticationProvider2());
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
http.formLogin(Customizer.withDefaults());
return http.build();
}
@Bean
public AuthenticationProvider customAuthenticationProvider(){
return new CustomAuthenticationProvider();
}
@Bean
public AuthenticationProvider customAuthenticationProvider2(){
return new CustomAuthenticationProvider2();
}
빈을 2개 등록시 자동적으로
이렇게 Provider가 등록된다.
'인프런 > 스프링 시큐리티 완전 정복 [6.x 개정판]' 카테고리의 다른 글
11) 인증 상태 영속성 - SecurityContextRepository & SecurityContextHolderFilter (1) | 2024.10.18 |
---|---|
10) 사용자 상세 서비스 - UserDetailsService , 사용자 상세 -UserDetails (1) | 2024.10.17 |
8) 인증 관리자 - AuthenticationManager (1) | 2024.10.15 |
7) 인증 아키텍처 - Authentication , SecurityContext / SecurityContextHolder (1) | 2024.10.14 |
6) 인증 프로세스 - logout() ,RequestCache / SavedRequest (0) | 2024.10.11 |
댓글