-
Spring Security - 구글 로그인 및 자동 회원가입Framework & Library/Spring Security 2021. 10. 4. 15:00
UserDetails, OAuth2User 타입의 통합
PrincipalDetails 클래스 수정
ㆍ 로그인 사용자의 정보와 OAuth 로그인 사용자의 정보를 받는 타입이 UserDetails, OAuth2User로 서로 다르기 때문에 구현하는데 불편함이 있었다.
ㆍ 이러한 불편함을 없애기 위해 두 개의 타입을 처리할 수 있는 클래스가 필요하다.
ㆍ 위 사진과 같이 기존의 PrincipalDetails 클래스에 OAuth2User 인터페이스를 추가로 구현한다.
ㆍ OAuth 로그인 사용자의 정보를 받기 위해 Map<String, Object> 타입의 변수인 attributes를 선언하고, 생성자를 추가한다.
ㆍ OAuth2User 인터페이스를 구현하고 getAttributes() 메서드와 getName() 메서드 위 사진과 같이 오버라이딩한다.
User 객체 속성 추가
ㆍ OAuth 로그인 사용자의 정보를 받기 위해 User 객체에 위 사진에 표시된 속성과 생성자를 추가한다.
PrincipalOauth2UserService 클래스 수정
ㆍ OAuth 로그인 사용자의 비밀번호를 암호화해줄 객체인 BCryptPasswordEncoder를 @Autowired 애너테이션을 통해 선언한다.
ㆍ loadUser() 메서드에 위 사진에 표시된 코드를 추가한다.
ㆍ OAuth 로그인을 수행한 사용자에 대한 정보를 받고, 로그인을 수행한 사용자의 username이 DB에 없을 경우 받은 정보로 객체를 생성한 후 DB에 저장하는 방식을 통해 회원가입을 집행한다.
테스트
IndexController 클래스 수정
ㆍ IndexController 클래스에 기존의 user() 메서드를 위 사진과 같이 변경한다.
ㆍ PrincipalDetails객체를 @AuthenticationPrincipal 애너테이션을 통해 매개변수로 받음으로써 일반 로그인 사용자와 OAuth 로그인 사용자에 대한 정보를 분리된 메서드가 아닌 하나에 메서드를 통해 받을 수 있다.
일반 로그인 수행
ㆍ 일반 로그인을 수행한 후 /user 주소에 접속하고 콘솔 창의 사용자 정보를 확인한다.
ㆍ 사용자의 정보가 정확하게 출력되고 있음을 확인하였다.
OAuth 로그인 수행
ㆍ OAuth 로그인을 수행한 후 /user 주소에 접속하고 콘솔 창의 사용자 정보를 확인한다.
ㆍ 사용자의 정보가 정확하게 출력되고 있음을 확인하였다.
결론
ㆍ 일반 로그인 사용자에 대한 정보를 받을 수 있는 타입은 UserDetails이고, OAuth 로그인 사용자에 대한 정보를 받을 수 있는 타입은 OAuth2User로 서로 다른 타입이다.
ㆍ 서로 다른 타입이기 때문에 두 가지 로그인 방식에 대한 정보를 받기 위해서는 서로 다른 메서드를 구현해야 한다.
ㆍ 서로 다른 메서드를 구현하는 방법은 비효율적이기 때문에 UserDetails와 OAuth2User 타입을 모두 커버하는 또 다른 클래스를 구현함으로써 위 문제를 해결한다.
ㆍ UserDetails 인터페이스와 OAuth2User 인터페이스를 구현하는 PrincipalDetails라는 클래스를 만들어 PrincipalDetailService 클래스와 PrincipalOauth2UserService 클래스를 통해 두 가지 타입을 모두 처리하는 방식으로 위 문제를 해결하였다.
728x90'Framework & Library > Spring Security' 카테고리의 다른 글
Spring Security - 네이버 로그인 (0) 2021.10.05 Spring Security - 페이스북 로그인 (0) 2021.10.04 Spring Security - Authentication 객체가 가질 수 있는 2가지 타입 (0) 2021.10.03 Spring Security - 구글 로그인 사용자 정보 받기 (0) 2021.10.02 Spring Security - 구글 로그인 준비 (0) 2021.10.02