본문 바로가기
프로젝트/SpringSecurity

[Spring Security] 7. OAuth 구글로그인(4)

by dantriss 2023. 7. 5.

유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


OAuth로 로그인을 했을 때 구글에서 받는 정보가 아닌 특수한 정보가 필요한 경우가 있다.

예를 들어 배송을 해야하는데 주소가 필요할 수도 있고, 포인트같은 건 구글에서 받아올수 있는 정보가 아니기 때문에

해당 유저도 db에 저장을 해줘야 한다. 

PrincipalOauth2UserService로 이동해서 비밀번호 암호화를 위한 BCryptPasswordEncoder와 유저 정보 저장을 위한 UserRepository를 Autwired 한다.

 

loadUser 함수에 다음과 같이 작성한다.

provider -> google, facebook, kakao 등 정보를 제공한 사이트

providerId -> 고유아이디

username -> 회원아이디

password -> 특정비밀번호로 통일

email -> 정보제공사이트에서 받은 email 그대로 사용

role -> 권한 user로 통일

String provider =  userRequest.getClientRegistration().getRegistrationId();
String providerId = oAuth2User.getAttribute("sub");
String username = provider+"_"+providerId;
String password = bCryptPasswordEncoder.encode("1111");
String email = oAuth2User.getAttribute("email");
String role = "ROLE_USER";

 

그 후 User 모델객체로 이동해 id를 제외한 생성자를 추가해준다. ( mac : cmd+n / window ctrl+insert)

cmd+n
id는 PK로 자동으로 회원가입 순대로 값이 들어가기 떄문에 하지 않아도 된다.

 

생성자를 생성하고 위에 @Builder 어노테이션을 추가해준다.

이어서 기본생성자를 만들어주기 위해 @NoArgsConstructor 어노테이션을 추가해준다,

 

다시 PrincipalOauth2UserService로 이동해서 해당 사용자가 OAuth로 처음 로그인을 했을 때 db에서 username으로 회원을 검색해보고 만약 처음 로그인한 회원이라면 자동으로 회원가입을 하게 if문을 사용해서 작성해준다.

User userEntity = userRepository.findByUsername(username);

if (userEntity==null){
    userEntity = User.builder()
            .username(username)
            .password(password)
            .email(email)
            .role(role)
            .provider(provider)
            .providerId(providerId)
            .build();

    userRepository.save(userEntity);
}

return new PrincipalDetails(userEntity,oAuth2User.getAttributes());

 

테스트를 위해서 IndexController에 user 메서드에서 콘솔에 유저 정보를 출력해본다.

 

에러가 발생해서 알려준대로 appliction.yml에 allow-circular-references를 true로 변경해준다.

main:
  allow-circular-references: true

 

일반회원과 구글로 각각 로그인해서 /user로 접근을 시도해보면 유저의 정보를 잘 출력하는 것을 확인할 수 있다.

OAuth로 자동회원가입한 유저
일반가입유저

 

db에서 확인해보면 OAuth로 로그인해서 가입을 하지 않은 유저도 자동가입이 된것을 확인할 수 있다.

댓글