입력된 로그인 정보와 DB에서 가져온 사용자 정보를 비교하는 인터페이스
사용자의 요청이 담긴 Authentication를 AuthenticationManager에 넘겨주며 해당 인터페이스를 ProviderManager가 구현
ProviderManager은 여러 AuthenticationProvider로 구성되며 AuthenticationProvider에서 실제 인증에 대한 부분 처리
인증 전의 Authentication 객체를 받아 인증이 완료된 객체 반환
AuthenticationProvider 인터페이스를 구현하여 해당 클래스를 AuthenticationManger로 등록
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private MemberService memberService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
// 1
String username = (String) authentication.getPrincipal();
String password = (String) authentication.getCredentials();
Member member = memberService.loadUserByUsername(username);
// 2
if (!passwordEncoder.matches(password, member.getPassword())) {
throw new BadCredentialsException(username);
}
// 3
if (!member.isEnabled()) {
throw new DisabledException(username);
}
//4
return new UsernamePasswordAuthenticationToken(member.getMemberId(), member.getMemberPw(), member.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
}
@Override
public boolean isEnabled() {
if (this.memberYn.equals("Y")) {
return true;
} else {
return false;
}
}
UserDetails의 메서드 오버라이딩
로그인 성공 시 핸들러
@Component
@RequiredArgsConstructor
public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
private final RequestCache requestCache = new HttpSessionRequestCache();
private final RedirectStrategy redirectStratgy = new DefaultRedirectStrategy();
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
HttpSession session = request.getSession();
session.setAttribute("greeting", authentication.getName() + "님 반갑습니다.");
response.sendRedirect("/");
}
}
로그인 실패 시 핸들러
@Component
public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
String errorMsg = null;
if (exception instanceof BadCredentialsException) {
errorMsg = "아이디 또는 비밀번호가 일치하지않습니다";
} else if(exception instanceof UsernameNotFoundException) {
errorMsg = "존재하지 않는 사용자입니다.";
} else if(exception instanceof DisabledException) {
errorMsg = "비활성화된 계정입니다.";
} else if(exception instanceof LockedException) {
errorMsg = "잠긴 계정입니다.";
}
request.setAttribute("errorMsg", errorMsg);
request.getRequestDispatcher("/login?error=true").forward(request, response);
}
}
에러 경우에 따른 에러 메시지 처리
JSP 에러메시지 처리
<c:if test="${not empty errorMsg}">
${errorMsg}
</c:if>
LoginController 에러메시지 처리
// 1
@GetMapping("/login")
public String loginForm(@RequestParam(value = "error", required = false) String error, Model model) {
return "login";
}
// 2
@PostMapping("/login")
public String login() {
return "/login";
}
* 로그아웃은 따로 구현하지 않아도 config에서 설정 가능
[JPA] 회원가입과 유효성 체크 (0) | 2021.04.20 |
---|---|
[SPRING SECURITY] CSRF (0) | 2021.04.16 |
[ERROR] JPAQueryFactory 의존성 문제 (0) | 2021.04.15 |
[JPA] getOne과 findById ID로 객체 조회하기 (0) | 2021.04.14 |
[ERROR] 순환참조 문제 (0) | 2021.04.14 |
댓글 영역