작성
·
227
0
안녕하세요 문득 궁금한점이 있어서 여쭤봅니다
@PostMapping("/login")
@ResponseBody
public String login() {
return "로그인 성공!!!";
}
위와 같은 단순 핸들러 메소드가 존재한다고 할때, 스프링 시큐티리의 커스텀 필터가 성공한 이후(successHandler가 실행된 이후)에도 저 메소드가 실행되지 않습니다
필터 인증에 실패한 경우엔 필터레이어에서 예외를 던지면서 그 이후 로직이 진행되지 않게 처리하는게 맞는것 같으나
필터 인증에 성공한 경우엔 필터를 거쳐서 핸들러 메소드를 실행하는것이 맞다고 생각했습니다
근데 생각과는 다르게 successHandler에서 objectmapper.writeValue메소드가 끝나고 나니 바로 클라이언트에게 응답이 갔습니다
핸들러 메소드까지 실행되게 하고 싶은데 방법이 있나요?
답변 3
3
인증에 성공한 후 SuccessHandler 보면 response 에서 헤더값을 설정한 후 특별한 액션을 취하지 않고 있는 것 같습니다.
public class JwtAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
@Autowired
JwtUtil jwtUtil;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
String principal = (String) authentication.getPrincipal();
List<String> roles = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
response.setHeader("X-AUTH-TOKEN", jwtUtil.createToken(principal, roles));
response.setStatus(HttpServletResponse.SC_OK);
}
}
가령
@PostMapping("/login")
public String login(UserEntity userEntity) {
return "로그인 성공!!!";
}
로 호출이 되기 위해서는
response.redirect("/login") 과 같은 구문이 추가 되어야 하는데 아무런 호출구문이 없습니다.
더군다나 post 방식이라 리다이렉트도 먹히지 않습니다.
또한 현재 통신 방식이 Rest 로 되어 있기 때문에 리다이렉트 방식은 통신이 다시 재개되는 것이기 때문에 올바른 처리가 아닙니다.
JwtAuthenticationSuccessHandler 에서 인증을 성공한 이후에는 ObjectMapper 로 전송할 도메인을 포맷팅한 후에 다시 클라이언트로 응답하는 구문이 추가 되어야 하고 응답을 받은 클라이언트에서 다시 Post 로 호출하는 식으로 처리가 되어야 할 것 같습니다.
Http Form 방식 으로 통신하는 것과 Rest 방식으로 통신하는 방식을 구분해서 구현해야 할 것 같습니다.
지금은 두가지를 방식을 동시에 혼용하고자 하는 것 같은데요
가능은 하지만 정확한 프로세스를 설계하고 진행해야 할 것 같습니다.
0
ajax로그인 학습을 바탕으로 만들어본 jwt로그인입니다
포스트맨을 사용하여 아이디와 비밀번호를 넣고 post방식으로 전송하면
필터 인증은 통과하여 jwt토큰은 발행되는데
/login의 "로그인 성공!!!!" 이부분은 아예 로직조차 타질 않습니다
0