Framework & Library/Spring Security

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 클래스를 통해 두 가지 타입을 모두 처리하는 방식으로 위 문제를 해결하였다.


 

GitHub - qlsdud0604/spring-security-basic: 스프링 시큐리티의 기초를 학습하는 공간

스프링 시큐리티의 기초를 학습하는 공간. Contribute to qlsdud0604/spring-security-basic development by creating an account on GitHub.

github.com

 

728x90