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
'혼자서 개발새발' 카테고리의 다른 글
Java ) 비밀번호를 자체 검증하는 사용자 정의 애노테이션을 만들자! (0) | 2024.02.06 |
---|---|
Springdoc ) Spring Boot 3 이상에서는 Swagger2 대신 Springdoc(Swagger3) (1) | 2024.01.05 |
Java) Decorator 패턴을 사용해보자! (1) | 2023.12.28 |
MAC(M2) 에 ubuntu 를 설치해서 리눅스를 환경을 이용해보자! (0) | 2023.10.19 |
JWT ) 프론트 서버와 통신하는데에 사용할 JWT 인증을 구현해보자 (0) | 2023.08.18 |