1. 개요
이 빠른 사용방법(예제)에서는 Spring Boot 애플리케이션에서 Spring Security의 인증 실패 처리를 사용자 지정하는 방법을 설명합니다. 목표는 양식 로그인 방식 을 사용하여 사용자를 인증하는 것 입니다.
Spring Boot 의 Spring Security 및 Form Login 에 대한 소개는 각각 this 및 this article 을 참조하십시오 .
2. 인증 및 승인
인증 및 권한 부여 는 시스템에 대한 액세스 권한을 부여할 때 필수적이고 중요한 역할을 하기 때문에 종종 함께 사용됩니다.
그러나 요청의 유효성을 검사할 때 다른 의미를 가지며 다른 제약 조건을 적용합니다.
- 인증 – 인증에 우선 합니다. 받은 자격 증명의 유효성을 검사하는 것입니다. 여기에서 사용자 이름과 비밀번호가 애플리케이션이 인식하는 것과 일치하는지 확인합니다.
- 인증 – 성공적으로 인증된 사용자가 애플리케이션의 특정 기능에 액세스할 수 있는 권한이 있는지 확인하는 것입니다.
인증 및 권한 부여 실패 처리를 모두 사용자 정의할 수 있지만 이 애플리케이션에서는 인증 실패에 중점을 둘 것입니다.
3. Spring Security의 AuthenticationFailureHandler
Spring Security 는 기본적으로 인증 실패를 처리하는 구성 요소를 제공합니다.
그러나 기본 동작이 요구 사항을 충족하기에 충분하지 않은 시나리오에 있는 것은 드문 일이 아닙니다.
이 경우 자체 구성 요소를 만들고 AuthenticationFailureHandler 인터페이스를 구현하여 원하는 사용자 지정 동작을 제공할 수 있습니다.
public class CustomAuthenticationFailureHandler
implements AuthenticationFailureHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
Map<String, Object> data = new HashMap<>();
data.put(
"timestamp",
Calendar.getInstance().getTime());
data.put(
"exception",
exception.getMessage());
response.getOutputStream()
.println(objectMapper.writeValueAsString(data));
}
}
기본적으로 Spring 은 오류에 대한 정보가 포함 된 요청 매개변수 를 사용하여 사용자를 다시 로그인 페이지로 리디렉션 합니다.
이 애플리케이션에서는 오류에 대한 정보와 오류 발생의 타임스탬프가 포함된 401 응답을 반환합니다.
기본 구성 요소 외에도 Spring 에는 원하는 작업에 따라 활용할 수 있는 구성 요소를 사용할 준비가 된 다른 구성 요소가 있습니다.
- DelegatingAuthenticationFailureHandler 는 AuthenticationException 하위 클래스를 다른 AuthenticationFailureHandlers 에 위임 합니다. 즉, AuthenticationException 의 다른 인스턴스에 대해 다른 동작을 생성할 수 있습니다.
- ExceptionMappingAuthenticationFailureHandler 는 AuthenticationException의 전체 클래스 이름 에 따라 사용자를 특정 URL로 리디렉션합니다.
- ForwardAuthenticationFailureHandler 는 AuthenticationException 유형에 관계없이 사용자를 지정된 URL로 전달합니다.
- SimpleUrlAuthenticationFailureHandler 는 기본적으로 사용되는 구성 요소이며, 지정된 경우 사용자를 failureUrl 로 리디렉션 합니다. 그렇지 않으면 단순히 401 응답을 반환합니다.
이제 Custom형 AuthenticationFailureHandler 를 생성했으므로 애플리케이션을 구성하고 Spring의 기본 핸들러 를 재정의하겠습니다 .
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user1 = User.withUsername("user1")
.password(passwordEncoder().encode("user1Pass"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user1);
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.failureHandler(authenticationFailureHandler())
return http.build();
}
@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
return new CustomAuthenticationFailureHandler();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
failureHandler() 호출 에 주목하십시오. 여기 에서 기본 구성 요소를 사용하는 대신 사용자 지정 구성 요소를 사용하도록 Spring 에 알릴 수 있습니다 .
4. 결론
이 예제에서는 Spring의 AuthenticationFailureHandler 인터페이스를 활용하여 애플리케이션의 인증 실패 핸들러를 사용자 정의 했습니다.
이 예제의 구현은 Github 프로젝트 에서 찾을 수 있습니다 .
로컬에서 실행할 때 localhost:8080 에서 애플리케이션에 액세스하고 테스트할 수 있습니다.