인프런/스프링 시큐리티 완전 정복 [6.x 개정판]

9) 인증 제공자 - AuthenticationProvider

backend dev 2024. 10. 16.

 

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가 등록된다.

댓글