상세 컨텐츠

본문 제목

[SPRING SECURITY] 커스텀 클래스와 로그인

JAVA/SPRING

by ranlan 2021. 4. 16. 01:04

본문

728x90

AuthenticationProvider

입력된 로그인 정보와 DB에서 가져온 사용자 정보를 비교하는 인터페이스

사용자의 요청이 담긴 Authentication를 AuthenticationManager에 넘겨주며 해당 인터페이스를 ProviderManager가 구현

ProviderManager은 여러 AuthenticationProvider로 구성되며 AuthenticationProvider에서 실제 인증에 대한 부분 처리

인증 전의 Authentication 객체를 받아 인증이 완료된 객체 반환

 

AuthenticationProvider 인터페이스를 구현하여 해당 클래스를 AuthenticationManger로 등록

  • AuthenticationManger 인증 요청을 받고 Authentication를 채움
  • AuthenticationProvider 실제 인증이 일어나며 성공하면 Authentication.isAuthenticated=true 반환

 

 

CustomAuthenticationProvider

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;
    }
}
  1. Authentication 로그인 정보 객체(아이디 principal,  비밀번호 credential)
  2. DB에 저장된 비밀번호와 비교하여 다를 때 예외처리
  3. 비활성화된 계정에 대해 예외처리
  4. Authentication 인터페이스의 구현체로 인증 성공 시 토큰 생성하여 반환 > UsernamePasswordAuthenticationToken

 

 

Member (UserDetails 상속받음)

 @Override
 public boolean isEnabled() {
     if (this.memberYn.equals("Y")) {
          return true;
     } else {
          return false;
     }
 }

UserDetails의 메서드 오버라이딩

 

 

AuthenticationSuccessHandler

로그인 성공 시 핸들러

@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("/");
    }
}

 

 

AuthenticationFailureHandler

로그인 실패 시 핸들러

@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);
    }
}

에러 경우에 따른 에러 메시지 처리

  • BadCredentialsException 비밀번호 불일치
  • UsernameNotFoundException 존재하지 않는 아이디
  • DisabledException 비활성화 계정
  • LockedException 잠긴 계정

 

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";
}
  1. 로그인 폼 연결과 로그인 실패 시 에러메시지 처리
  2. 로그인 폼 전송

* 로그아웃은 따로 구현하지 않아도 config에서 설정 가능 

 

728x90

'JAVA > SPRING' 카테고리의 다른 글

[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

관련글 더보기

댓글 영역