SpringbootSecurity

SpringbootSecurity/Springboot로 구글로그인 해보기(3)/구글 로그인 및 자동 회원가입 진행 완료

25G 2021. 8. 29. 13:10

저번 포스팅에서 이어집니다.

PrincpalDetails를 만든 이유는 Authentication객체에 일반 로그인을 했을 경우의 타입과 oauth를 사용해서 로그인한 경우의 타입 이 두 가지 타입을 일치시키기 위해서이다.

OAuth2User에 있는 함수 오버라이딩

그럼 이제 회원 oauth 회원가입을 해보자

 

회원가입

OAuth2User함수 오버라이딩

 

여기서 attributes가 가지고 있는 정보는 아래와 같다.

getAttributes
{sub=105617652356040885552,
 name=, given_name=, family_name=
, picture=https://lh3.googleuserconent.com/a/AATXAJzvxBp9CVwqOqPeThYDMDJvNPxhu
, email=@gmail.com
, email_verified=true
, locale=ko}

sub는 pk같은거다 그럼 자동 회원가입을 시키기 위해선 이 정보를 가지고 와서 우리 db에 밀어 넣어야 한다. 

 

일단 user모델로 가서 해당 생성자를 만들어준다

User도메인에 생성자 추가 builder사용
구글 로그인을 하는 클래스

 

구글로그인 후처리를하는 함수

loadUser함수는 구글로 부터 받은 userRequest를 후처리 하는 함수이기 때문에 여기서 강제로 db에 밀어 넣어야 한다.

PrincipalDetails가 만들어져서 PrincipalDetails가 Authentication안에 들어가게 된다.

일반적인 로그인을 하면 user를 들고 있겠지만

oauth2 login을 하게 되면 user와 attributes라는 맵을 가지고 있다.

 

그럼 이제 일반적인 로그인과 oauth로그인을 했을 때 어떻게 되는지 테스트를 해보자

일반적인 로그인을 했을 때

PrincipalDetails에 user정보가 잘 들어 있다.

 

oauth2 로그인을 했을 때

와우!~~~

이제 두 가지 경우 모두 PrincipalDetails로 받아낼 수 있다.

 

그럼 이제부터 

OAuth로그인을 해도 PrincipalDetails로 받을 수 있고

일반 로그인을 해도 PrincipalDetails로 받을 수 있다. 이제 따로 분기해서 관리할 필요도 없고

더 좋은 것은

Authentication으로 접근하면 다운 캐스팅을 해야 하는데 @AuthenticationPrincipal으로 접근하면 다운 캐스팅을 할 필요도 없어진다. 바로 접근 가능

그럼 @AuthenticationPrincipal은 언제 활성화되는지만 알면 된다.

 

이 클래스를 Severice를 사용해서 메모리에 띄우지 않은 이유는 PrincipalDetails를 리턴 시켜주기 위해서이다.

 

oauth2 User로그인을 하는 후처리 함수 loadUser함수를 오버 라이딩을 한 이유와

일반로그인을하는 오버라이딩된 함수

일반 로그인을 처리하는 함수를 오버 라이딩 한 이유 또한 PrincipalDetails를 리턴하기 위해서이다(타입을 일치시키기 위해서)

그리고 Oauth로 로그인을 했을 때 자동 회원가입을 시키기 위해서입니다.

loadUser함수

db를 확인해보면 자동 로그인이 잘 돼있다.

 

그리고 중요한 점 이 하나 더 있다

@AuthenticationPrincipal 어노테이션은

로그인 후처리를 하는 loadUser함수(oauth)와 loadUserByUsername(일반 로그인) 함수가 종료됐을 때 loadUserByUsername어노테이션이 만들어진다.

 

https://github.com/fj2008/SpringbootSecurity