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
'TIL' 카테고리의 다른 글
275일차(모험 184일차) - 문제점 (0) | 2022.06.18 |
---|---|
274일차(모험 183일차) - 로그인 (0) | 2022.06.16 |
272일차(모험 181일차) - 회원가입 성공 후 로그인 페이지 전환 (0) | 2022.06.14 |
271일차(모험 180일차) - 불필요한 코드 제거 (0) | 2022.06.13 |
268일차(모험 177일차) - 회원가입 실시간 중복 체크하기 2 (0) | 2022.06.10 |