defaultSuccessUrl, failureUrl
Spring Security에서는 인증에 성공, 실패 했을 때 단순히 redirect만 시켜주고 싶다면 defaultSuccessUrl 혹은 failureUrl을 사용할 수 있다. 이렇게 설정해 놓으면 지정된 url로 redirect가 된다. api를 호출할 수도 있고 화면을 리턴할 수도 있다. 그런데 이렇게 redirect를 시키면 아무 값도 함께 넘겨줄 수가 없다. 심지어 FormLogin을 했을 경우에는 컨트롤러로 redirect를 시켜도 SecurityContext에서 Authentication을 가져오는 것도 안된다. 이럴 때 사용할 수 있는 방법이 바로 아래 나올 successHandler와 failureHandler이다.
successHandler, failureHandler
defaultSuccessUrl 혹은 failureUrl과 마찬가지로 인증이 완료되면 후속 작업으로 successHandler, failureHandler를 사용할 수 있다. 여기서는 추가적으로 로직을 넣을 수 있는데 SecurityContextHolder의 Authentication 객체를 받아서 사용할 수 있다. 예를 들면 인증 객체를 사용해서 로그인이 되었다는 푸시 알림을 날릴 수도 있고 인증 HttpServletResponse 객체를 사용해서 HttpStatus도 지정해줄 수 있다. 특히 failureHandler에서는 인증 과정에서 발생한 Exception을 받아서 사용할 수가 있는데 만약 커스텀한 인증 과정을 사용한다면 Exception에 메세지를 담아서 넘기면 failureHandler에서 메세지를 추출해서 케이스에 따른 처리를 할 수 있다.
@Component
public class LoginSuccessHandler extends BaseService implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
...doSomething
}
}
@Component
public class LoginFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) {
doSomething...
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private final CustomAuthenticationProvider customAuthenticationProvider;
private final LoginSuccessHandler loginSuccessHandler;
private final LoginFailureHandler loginFailureHandler;
public SecurityConfiguration(CustomAuthenticationProvider customAuthenticationProvider, LoginSuccessHandler loginSuccessHandler, LoginFailureHandler loginFailureHandler) {
this.customAuthenticationProvider = customAuthenticationProvider;
this.loginSuccessHandler = loginSuccessHandler;
this.loginFailureHandler = loginFailureHandler;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(customAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity security) throws Exception {
security
.csrf().ignoringAntMatchers("/api/dologin").csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.headers().frameOptions().disable()
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.successHandler(loginSuccessHandler)
.failureHandler(loginFailureHandler);
}
}
'Spring' 카테고리의 다른 글
Spring - @EnableGlobalMethodSecurity (0) | 2022.08.14 |
---|---|
Java - Checked and Unchecked Exception (0) | 2022.08.13 |
Spring - @Component @Service Annotation 들의 차이 (0) | 2022.08.09 |
Spring - CSRF란 (0) | 2022.08.07 |
Spring - Oauth2 Authorization Server에 대해서 (0) | 2022.08.06 |