- 회원가입의 경우 유효성 검사에 실패했을 경우 사용자에게 간단하게 메시지를 보여주는 방식으로 회원가입 실패 처리를 구현해놓았지만 로그인의 경우 이러한 처리가 없어 로그인 실패 처리를 구현해주었습니다.
- 로그인 실패의 경우 회원가입 실패 시의 처리와는 달리 컨트롤러에서 발생하는 예외가 아닌 서비스 단에서 발생하는 예외였기 때문에
@ControllerAdvice
와@ExceptionHandler
를 이용한 처리 방식으로는 제대로 동작하지 않았습니다. - 따라서
SecurityConfig
클래스에failureHandler()
메소드를 추가해줌으로써 이를 구현해주었습니다.
📝 SecurityConfig
package com.cos.photogram.config;
...
@RequiredArgsConstructor
@EnableWebSecurity //Security 활성화
@Configuration //IoC
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final AuthenticationFailureHandler customAuthFailureHandler;
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.formLogin()
...
.failureHandler(customAuthFailureHandler) //로그인 실패시 이를 처리할 핸들러
...
}
}
📝 CustomAuthFailureHandler
- 로그인 실패 예외를 핸들링하기 위한
CustomAuthFailureHandler
클래스는 아래와 같이 구현하였습니다.
package com.cos.photogram.handler;
...
@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("/auth/signin?error=true&exception=" + errorMessage);
super.onAuthenticationFailure(request, response, exception);
}
}
- 즉, 위와 같은 예외가 발생하면 특정 에러 메시지를 저장하여
setDefaultFailureUrl()
메소드를 통해 컨트롤러로 전달하는 것입니다.
📝 Controller
- 이후 컨트롤러에서는 위에서 전달받은 메시지를
Model
객체를 통해 다시 View로 전달합니다.
package com.cos.photogram.web;
...
@RequiredArgsConstructor
@Controller
public class AuthController {
/* 로그인 페이지 */
@GetMapping("/auth/signin")
public String signinForm(
@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 "auth/signin";
}
}
📝 View
- 마지막으로 로그인 페이지에서는 컨트롤러에서 전달받은 오류 메시지를 다음과 같이 사용자에게 출력해주면 됩니다.
<c:if test="${error}">
<p class="exception">${exception}</p>
</c:if>
'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글
[Photogram] 실시간 알림 (0) | 2023.03.02 |
---|---|
[Photogram] 해시태그 기능 추가 (0) | 2023.01.03 |
[Photogram] 검색 기능 구현 (0) | 2022.12.22 |
[Photogram] OAuth2 페이스북 로그인 (0) | 2022.07.19 |
[Photogram] 유효성 검사 자동화 - AOP 처리 (0) | 2022.07.18 |