본문 바로가기
혼자서 개발새발

Spring Security ) RestAPI 로 통신할 때 Session을 사용하는 자동 로그인을 사용할 때 Handling 하기

by 휴일이 2024. 1. 5.

 

 

Spring Security 를 formLogin() 으로는 사용해보았는데

APPLICATION/JSON 으로 받아서 사용하는 것은 해본 적이 없었는디,,@ㅅ@

이번에 구현을 해보게 되어 간단히 사용법을 작성해보고자 한다~

 

 

UsernamePasswordAuthenticationFilter

 

해당 인증 필터에서 JSON를 구현하면 된다아.

 

 

 

@Slf4j
public class LoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

    public LoginAuthenticationFilter(final String defaultFilterProcessesUrl,
                                     final AuthenticationManager authenticationManager) {
        super(defaultFilterProcessesUrl, authenticationManager);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        String method = request.getMethod();

        if (!method.equals(RequestMethod.POST.name())) {
            log.error("POST 요청이 아님");
            throw new AuthenticationServiceException("Authentication method not supported: " + method);
        }

        ServletInputStream inputStream = request.getInputStream();

        LoginDto loginDto = new ObjectMapper().readValue(inputStream, LoginDto.class);

        return this.getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(
                loginDto.username,
                loginDto.password
        ));
    }
    public record LoginDto(
            String username,
            String password
    ){}
}

 

 

1. POST 로 온 요청만 받을 수 있게 설정하구

2. 요청으로 온 아이디, 패스워드 값을 받아 Authentication 객체로 만들어 넣어주면 됨 ^0^/)

 

 

사실 이거 자체는 크게 어렵지는 않다. 다만...

 

formLogin 을 사용하면

Security Config -> formLogin() 에서 바로

실패시 동작할 엔트리포인트 등을 설정할 수 있는데

이렇게 인증 필터를 새로 구현하게 되면

SecurityConfig 에서 인증 성공 / 실패시에 실행할 로직을 추가할 수가 없게 된다 ㅡㅅㅡ

exceptionHandling() 써도 안 통함.ㅎ

 

 

그러면 어떻게 해야하나?

 

 

 

    public AbstractAuthenticationProcessingFilter abstractAuthenticationProcessingFilter
            (
                    final AuthenticationManager authenticationManager
            ) {

        LoginAuthenticationFilter filter = new LoginAuthenticationFilter(
                "/api/login",
                authenticationManager
        );

        filter.setAuthenticationFailureHandler(authenticationFailureHandler);
        filter.setAuthenticationSuccessHandler(authenticationSuccessHandler);
        return filter;
    }

 

 

filter 에서 

filter.setAuthenticationFailureHandler(authenticationFailureHandler);
filter.setAuthenticationSuccessHandler(authenticationSuccessHandler);

 

 

이렇게 추가를 해주며는 된다아.

참고로 난 이렇게 해당되는 예외에 따라서

에러코드를 다르게 주려고 설정햇슴...

 

 

 

728x90