본문 바로가기

Spring Boot/Security

[SpringBoot Secyruty] 구글 로그인 (2)

 

 

첫번째 - 구글 로그인 진행 시 후처리 만들기

1.패키지 생성 = oauth

 

 

2.CLASS 생성 = PrincipalOauth2UserSerivce

 

 

3.PrincipalOauth2UserSerivce CLASS 작성

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService{

}

 

 

4.SecurityConfig CLASS -> 코드 추가

@Autowired
private PrincipalOauth2UserService principalOauth2UserService;

.userInfoEndpoint()
.userService(principalOauth2UserService);

 

 

5.PrincipalOauth2UserSerivce CLASS -> 코드 추가
    :이제 로그인하고 나서 어떻게 처리할지는 여기서 정의하면 됨
    :스프링부트 Restart 한 번하고 구글로그인하면 Console에 여러 정보들이 찍힘

package com.goodbam.security1.config.oauth;

import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@Service 
public class PrincipalOauth2UserService extends DefaultOAuth2UserService{ 

	@Override
	public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
		System.out.println("getClientRegistration : " + userRequest.getClientRegistration());
		System.out.println("getClientRegistration.getClientName() : " + userRequest.getClientRegistration().getClientName());
		System.out.println("getAccessToken : " + userRequest.getAccessToken().getTokenValue());
		System.out.println("getAttributes : " + super.loadUser(userRequest).getAttributes());
		
		return super.loadUser(userRequest);
	}
}

 

 

두번째 - 일반 로그인과 간편 로그인 묶기

흐름 정리

  -세션 안에 스프링 시큐리티가 관리하는 자기만에 세션이 따로 있음

  -시큐리티 세션에 들어갈 수 있는 타입은 Authentication 객체밖에 없음

  -Authentication 객체에 들어갈 수 있는 타입은 2가지임

    1.UserDetails 타입

        :일반 회원가입 절차를 걸쳐 로그인하는 경우 사용됨

    2.OAuth2User 타입

        :구글로 간편 로그인하는 경우 사용됨

 

문제 사항

 -회원가입 진행시 User 타입이 필요함

 -UserDetails(일반 로그인) 타입과 OAuth2User(간편 로그인) 타입은 User 타입을 들고 있지 않음

 -일반 로그인과 간편 로그인(구글 로그인)이 각각 데이터 타입이 다름

 

해결방안

 -UserDetails 타입과 OAuth2User 타입을 하나의 클래스로 묶어서 만듬

 

1.PrincipalDetails CLASS -> 어노테이션 추가

 

 

2.PrincipalDetails CLASS -> OAuth2User 추가

 

 

세번째 - 구글 로그인으로 회원가입 진행

1.PrincipalDetails CALSS -> 전역 변수 추가

 

 

2.PrincipalDetails CALSS -> 생성자 추가

 

 

3.PrincipalDetails CALSS -> getAttributes METHOD -> return 값 변경



4.PrincipalOauth2UserService CLASS -> 전역 변수 추가

 

 

5.PrincipalOauth2UserService CLASS -> 전역 변수 추가

 

 

6.PrincipalOauth2UserService CLASS -> loadUser METHOD 수정

 

 

7-1.User CLASS -> 생성자 추가

 

 

7-2.User CLASS -> id 체크 풀고 Generate

 

 

7-3.User CLASS -> @Builder 어노테이션 추가 Super() 삭제 

 

 

7-4.User CLASS -> @NoArgsConstructor 어노테이션 추가

 

 

8.PrincipalOauth2UserService CLASS -> loadUser METHOD 수정

    :이미 회원가입이 되어 있는지 확인하고 안되어 있으면 회원가입 완료

 

 

 

-끝-