카카오 사용자 정보로 회원가입 구현

송영재·2022년 10월 23일

Spring

목록 보기
18/45
  • 33) 카카오 사용자 정보로 회원가입

    • User 테이블에 'kakaoId' 추가
      • [코드스니펫] model > User
        import lombok.Getter;
        import lombok.NoArgsConstructor;
        import lombok.Setter;
        
        import javax.persistence.*;
        
        @Setter
        @Getter // get 함수를 일괄적으로 만들어줍니다.
        @NoArgsConstructor // 기본 생성자를 만들어줍니다.
        @Entity // DB 테이블 역할을 합니다.
        public class User {
        
            // ID가 자동으로 생성 및 증가합니다.
            @GeneratedValue(strategy = GenerationType.AUTO)
            @Id
            private Long id;
        
            // nullable: null 허용 여부
            // unique: 중복 허용 여부 (false 일때 중복 허용)
            @Column(nullable = false, unique = true)
            private String username;
        
            @Column(nullable = false)
            private String password;
        
            @Column(nullable = false, unique = true)
            private String email;
        
            @Column(nullable = false)
            @Enumerated(value = EnumType.STRING)
            private UserRoleEnum role;
        
            @Column(unique = true)
            private Long kakaoId;
            
            public User(String username, String password, String email, UserRoleEnum role) {
                this.username = username;
                this.password = password;
                this.email = email;
                this.role = role;
                this.kakaoId = null;
            }
        
            public User(String username, String password, String email, UserRoleEnum role, Long kakaoId) {
                this.username = username;
                this.password = password;
                this.email = email;
                this.role = role;
                this.kakaoId = kakaoId;
            }
        }
    • 회원 가입 kakaoId 를 가진 회원이 없는 경우에만 회원 가입
      • [코드스니펫] 카카오 사용자 회원가입
        				// DB 에 중복된 Kakao Id 가 있는지 확인
                Long kakaoId = kakaoUserInfo.getId();
                User kakaoUser = userRepository.findByKakaoId(kakaoId)
                        .orElse(null);
                if (kakaoUser == null) {
                    // 회원가입
                    // username: kakao nickname
                    String nickname = kakaoUserInfo.getNickname();
        
                    // password: random UUID
                    String password = UUID.randomUUID().toString();
                    String encodedPassword = passwordEncoder.encode(password);
        
                    // email: kakao email
                    String email = kakaoUserInfo.getEmail();
                    // role: 일반 사용자
                    UserRoleEnum role = UserRoleEnum.USER;
        
                    kakaoUser = new User(nickname, encodedPassword, email, role, kakaoId);
                    userRepository.save(kakaoUser);
                }
      • [코드스니펫] repository > UserRepository
        import com.sparta.springcore.model.User;
        import org.springframework.data.jpa.repository.JpaRepository;
        
        import java.util.Optional;
        
        public interface UserRepository extends JpaRepository<User, Long> {
            Optional<User> findByUsername(String username);
            Optional<User> findByKakaoId(Long kakaoId);
        }
  • 34) 강제 로그인 처리

    • 스프링 시큐리티의 로그인 처리 과정

    • 로그인 성공 시

      • "로그인 성공 사용자 정보" (UserDetails) 는 SecurityContext 에 저장됨

        • User < UserDetails < UsernamePasswordAuthenticationToken < SecurityContext
    • 강제 로그인 처리 방법

      • [코드스니펫] 강제 로그인 처리
        				// 4. 강제 로그인 처리
                UserDetails userDetails = new UserDetailsImpl(kakaoUser);
                Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
      • SecurityContextHolder 를 통해 SecurityContext 에 "로그인 성공 사용자 정보" 직접 추가

0개의 댓글