이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
DB 연동 인증 처리(2): CustomAuthenticationProvider
- 지난번에 생성한 CustomUserDetailsService를 통해 반환받은 AccountContext(UserDetails 구현체) 객체를 받아 추가적인 검증을 진행하는 클래스인 AuthetnicationProvider 구현체를 생성한다.
CustomAuthenticationProvider 구현
CustomAuthenticationProvider
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String)authentication.getCredentials();
AccountContext accountContext = (AccountContext) userDetailsService.loadUserByUsername(username);
// AuthenticationProvider는 사용자가 입력한 패스워드와 UserDetails의 패스워드와 비교한다.
if (!passwordEncoder.matches(password, accountContext.getPassword())) {
throw new BadCredentialsException("BadCredentialsException");
}
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(accountContext.getAccount(), null, accountContext.getAuthorities());
return authenticationToken;
}
@Override
public boolean supports(Class<?> authentication) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
}
- authenticate
- 검증을 위한 구현
- AuthenticationProvider는 사용자가 입력한 패스워드와 UserDetails로 제공받은 패스워드와 서로 비교해 일치하지 않으면 예외를 발생시킨다.
- 일치하면 새로운 Authentication 객체를 생성해 AuthenticationManager에게 반환한다.
- supports
- authentication 파라미터의 타입과 CustomAuthenticationProvider에서 사용하고자 하는 토큰의 타입이 서로 일치하는지 검사한다.
- 만약 일치하면 Provider 인증 처리가 가능해진다.
- authentication 파라미터의 타입과 CustomAuthenticationProvider에서 사용하고자 하는 토큰의 타입이 서로 일치하는지 검사한다.
AuthenticationProvider는 사용자가 입력한 패스워드와 UserDetails의 패스워드와 비교한다.
AuthenticationProvider는 사용자가 입력한 패스워드와 UserDetails의 패스워드와 비교한다.
참고
UsernamePasswordAuthenticationToken의 생성자는 다음과 같이 2개가 존재한다.
첫번째 생성자는 사용자가 인증을 시도할 때 인증 필터가 사용자의 아이디와 패스워드 정보를 인증 객체에 담아 AuthenticationManager에게 전달할 때 사용한다.
현재 우리는 AuthetnicationProvider에서 Authentication 객체에 UserDetails 정보와 Authriteis 정보를 담아 AuthenticationManager에게 전달해야 하므로 두 번째 생성자를 사용해야 한다.
여기서 principal은 인증에 성공한 인증 객체를 의미한다. (여기서는 Account 객체)
credentials는 패스워드를 의미한다.
참고
CustomAuthenticationProvider에서 수행하는 검증의 구현부는 개발자의 설계나 정책에 따라 달라질 수 있다.
SecurityConfig
- 직접 생성한 CustomAuthenticationProvider 클래스를 스프링 시큐리티에서 사용할 수 있도록 SecurityConfig 파일에 설정을 추가해야 한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public CustomAuthenticationProvider customAuthenticationProvider() {
return new CustomAuthenticationProvider();
}
...
}
실행
- 데이터베이스에는 다음과 같이 ROLE_USER 권한을 가진 user가 등록되어있다.
- 사용자가 인증을 시도하면 다음과 같이 우리가 구현한 CustomAuthenticationProvider가 정상적으로 동작하는 것을 확인할 수 있다.
'스프링 시큐리티 > 실전프로젝트 - 인증 프로세스 Form 인증 구현' 카테고리의 다른 글
로그아웃 및 인증에 따른 화면 보안 처리 (0) | 2023.02.12 |
---|---|
커스텀 로그인 페이지 생성하기 (0) | 2023.02.11 |
DB 연동 인증 처리(1): CustomUserDetailsService (0) | 2023.02.11 |
사용자 DB 등록 및 PasswordEncoder (0) | 2023.02.10 |
정적 자원 관리 - WebIgnore 설정 (0) | 2023.02.10 |