springframework/시작하자SpringSecurity

38.AjaxLoginUrlAuthenticationEntryPoint, AjaxAccessDeniedHandler

Jungsoomin :) 2020. 9. 30. 00:24

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();

    }