TIL

273일차(모험 182일차) - 로그인 예외 처리

haedal-uni 2022. 6. 15. 23:43
728x90

해당 글을 보고 코드를 추가했다.

출처 : Spring Boot 게시판 Security 로그인 실패시 메시지 출력하기

 

 

* 참고한 블로그

인증 실패 시 인증을 담당하는 Provider가 던진 예외를 Fail Handler에게 전달

Fail Handler가 받는 예외 디폴트 Provider가 리턴하는 결과 (커스터마이징 가능)
AuthenticationServiceException - null 값을 리턴
BadCredentialException - UsernameNotFoundException 예외를 throw
- UserDetails 객체를 리턴했으나, 아이디 또는 비밀번호가 틀림
LockedException - UserDetails 객체의 isAccountNonLocked() 메소드의 리턴값이 false
DisabledException - UserDetails 객체의 isEnabled() 메소드의 리턴값이 false
AccountExpiredException - UserDetails 객체의 isAccountNonExpired() 메소드의 리턴값이 false
CredentialExpiredException - UserDetails 객체의 isCredentialsNonExpired() 메소드의 리턴값이 false

출처 : 스프링 Security_로그인_로그인 실패 대응 로직 [3/9]

 

 

 

 

나는 login html이 response로 전부 띄워져서 원하는 값만 가져오는 것에 애를 먹었다.

(아래 사진 참고)

 

@Component
public class CustomAuthFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
            throws IOException, ServletException {
        String errorMessage;
        if (exception instanceof BadCredentialsException) {
            errorMessage = "아이디 또는 비밀번호가 맞지 않습니다. 다시 확인해 주세요.";
        } else if (exception instanceof InternalAuthenticationServiceException) {
            errorMessage = "내부적으로 발생한 시스템 문제로 인해 요청을 처리할 수 없습니다. 관리자에게 문의하세요.";
        } else if (exception instanceof UsernameNotFoundException) {
            errorMessage = "계정이 존재하지 않습니다. 회원가입 진행 후 로그인 해주세요.";
        } else if (exception instanceof AuthenticationCredentialsNotFoundException) {
            errorMessage = "인증 요청이 거부되었습니다. 관리자에게 문의하세요.";
        } else {
            errorMessage = "알 수 없는 이유로 로그인에 실패하였습니다 관리자에게 문의하세요.";
        }
        errorMessage = URLEncoder.encode(errorMessage, "UTF-8");
        setDefaultFailureUrl("/user/login?error=true&exception=" + errorMessage);
        super.onAuthenticationFailure(request, response, exception);
    }
}

 

 

 

@GetMapping("/user/login")
public String login(@RequestParam(value = "error", required = false) String error,
                    @RequestParam(value = "exception", required = false)
                            String exception, Model model) {
    model.addAttribute("error", error);
    model.addAttribute("exception", exception);

    return "login";
}

 

 

 

html에 아래와 같이 입력했는데 반영이 되지 않았다.

<span id="exception" th:text="${exception}"></span>

 

 

그래서 ajax를 이용해서 response로 반영이 된 login.html을 받았지만 login.html

전체 코드를 받아서 원하는 값만 받지 못하고 있다. ( 아래와 같이 떴다. )

 

 

 

 

 

 

 

이렇게 삽질을 시작했고 CustomAuthFailureHandler 파일이 예외처리를 했으니 

내가 원하는 값을 띄워주지 않을까 해서 아래와 같이 작성해봤다.

 

@PostMapping("/user/login/input")
public String login(@ModelAttribute LoginDto loginDto) {
    System.out.println("controller");
    return userService.login(loginDto);
}
public String login(LoginDto loginDto) {
    String username = loginDto.getUsername();
    String password = loginDto.getPassword();

    // id 찾기
    Optional<User> foundId = userRepository.findByUsername(username);

    //pw 찾기
    Optional<User> foundPw = userRepository.findAllByUsername(username);

    if (foundId.isPresent()) {
        String encodedPw = foundPw.get().getPassword();
        System.out.println("encodedPw = " + encodedPw);
        if (passwordEncoder.matches(password, encodedPw) && (!password.equals(encodedPw))) {
            return "환영합니다.";
        } else {
            return "비밀번호를 잘 못 입력하셨습니다.";
        }
    }
    else {
        return "등록된 사용자가 없습니다.";
    }

}

 

이렇게 입력하니 값이 잘 나왔다.

그러나 CustomAuthFailureHandler 를 작성하고 활용하지 못했고 로그인을 실행한게 아니라

로그인 실패했을 때 로직을 작성한 거라서 아직 갈 길이 멀다.

 

 

 

 

 

728x90