AuthenticationEntryPoint , AccessDeniedHandler 를 구현하여 HttpSecurity 의 하위 API에 등록한다.
AjaxAuthenticationEntryPoint 구현, response에 401상태코드를 던진다.
- 익명 사용자에 대한 AccessDeniedException 처리는 AuthenticationEntryPoint로 넘어가는 것을 기억하자.
public class AjaxLoginAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "UnAuthorized");//401
}
}
AuthenticationSuccessHandler 구현, reponse에 200상태코드를 추가하고 ContentType을 설정한다.
- CustomAjaxAuthenticationToken 을 받아와 principal 의 최종 인증 정보를 꺼내와 사용한다.
- ObjectMapper 로 원하는 메시지나 정보를 보낸다.
public class CustomAjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
Account account = (Account)authentication.getPrincipal();
response.setStatus(HttpStatus.OK.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
objectMapper.writeValue(response.getWriter(),account);// objectMapper 로 변환시킴
}
}
등록
AccessDeniedHandler 를 Bean 으로 등록, exceptionHandling() 으로 ExceptionTranslationFilter 를 작동시켜 하위 API인 authenticationEntryPoint() , accessDeniedHandler() 에 구현한 AjaxAuthenticationEntryPoint , AuthenticationSuccessHandler 를 등록한다.
@Bean
public AccessDeniedHandler ajaxAccessDeniedHandler(){
return new AjaxAccessDeniedHandler();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/**")
.authorizeRequests()
.antMatchers("/api/messages").hasRole("MANAGER")
.anyRequest().authenticated()
.and()
.addFilterBefore(ajaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class);// 해당필터 앞에 위치시킴
http
.exceptionHandling()
.authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint())
.accessDeniedHandler(ajaxAccessDeniedHandler());
http
.csrf().disable();
}
'springframework > 시작하자SpringSecurity' 카테고리의 다른 글
37. 동적 인가 방식 개요 (0) | 2020.09.30 |
---|---|
39.Ajax 로그인 구현, CSRF (0) | 2020.09.30 |
37.AjaxAuthenticationSuccessHandler,AjaxAuthenticationFailureHandler (0) | 2020.09.29 |
36.CustomAjaxAuthenticationProvider (0) | 2020.09.29 |
35.AjaxAuthenticationFilter (0) | 2020.09.29 |