저번 포스팅에서 이어집니다.
PrincpalDetails를 만든 이유는 Authentication객체에 일반 로그인을 했을 경우의 타입과 oauth를 사용해서 로그인한 경우의 타입 이 두 가지 타입을 일치시키기 위해서이다.
그럼 이제 회원 oauth 회원가입을 해보자
회원가입
여기서 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모델로 가서 해당 생성자를 만들어준다
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로 로그인을 했을 때 자동 회원가입을 시키기 위해서입니다.
db를 확인해보면 자동 로그인이 잘 돼있다.
그리고 중요한 점 이 하나 더 있다
@AuthenticationPrincipal 어노테이션은
로그인 후처리를 하는 loadUser함수(oauth)와 loadUserByUsername(일반 로그인) 함수가 종료됐을 때 loadUserByUsername어노테이션이 만들어진다.
'SpringbootSecurity' 카테고리의 다른 글
SpringbootSecurity/Springboot로 네이버 로그인 해보기 (yml에서 provider 설정하기) (0) | 2021.09.01 |
---|---|
SpringbootSecurity/Springboot로 페이스북 로그인 해보기 (0) | 2021.08.31 |
SpringbootSecurity/Springboot로 구글로그인 해보기(3)/Authentication객체가 가질 수 있는 2가지 타입 (0) | 2021.08.29 |
SpringbootSecurity/Springboot로 구글로그인 해보기(2)/구글 회원 프로필 정보 (0) | 2021.08.29 |
SpringbootSecurity/Springboot로 구글로그인 해보기(1)/구글 로그인 준비(설정) (0) | 2021.08.27 |