JisooPyo / KP3C-backoffice-project

스레드와 트위터를 참고하여 SNS 사이트를 만들어보고 백오피스까지 구현해보는 프로젝트
1 stars 2 forks source link

Username과 Email 두 가지로 로그인하는 방법 #62

Open jungeun5-choi opened 1 year ago

jungeun5-choi commented 1 year ago

Username과 Email 두 가지로 로그인하는 방법

  • 제약조건: 한 필드에 username과 email, 둘 중 하나만을 입력해야한다.

Kakao 로그인 기능이 추가되어, usernameemail 두 가지 방법으로 로그인 할 필요가 생겼다. 이에 세가지 방법을 고려해보았다.

1. 내부에서 `username`과 `email` 두 가지를 검사하도록 하기
2. `UserDetailsService` 클래스를 상속 받는 클래스를 하나 더 만들고, 두 가지를 입력받도록 하기
3. 로그인 방식을 하나로 합치기

여기서 1번 UserRepository 내부에서 usernameemail 두 가지를 사용하여 User를 찾도록 하는 방법을 선택하였다.

수정 전, 기존 메서드 UserDetailsImpl.java

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("Not Found " + username));
    return new UserDetailsImpl(user);
}

수정 후

1. UserRepository에 findByUsernameOrEmail 메서드 추가

Optional<User> findByUsernameOrEmail(String username, String email);

2. UserDetailsImpl.loadUserByUsername 수정

@Override
public UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException {
    User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail)
                .orElseThrow(() -> new UsernameNotFoundException("Not Found " + usernameOrEmail));
    return new UserDetailsImpl(user);
}
jungeun5-choi commented 1 year ago

postman 테스트 방법

username 로그인

{
    "username": "admin1",
    "password": "newPass!123"
}

email 로그인

{
    "username": "admin1@email.com",
    "password": "newPass!123"
}

postman 테스트 결과

login_username

login_email