[spring boot] 게시판 스프링 시큐리티와 OAuth2.0으로 로그인 기능 구현 - 01

Momenter·2021년 7월 26일
0

Spring Boot

목록 보기
13/15

OAuth로 로그인 기능을 구현 하는 이유

  • 로그인 시 보안, 회원가입 시 이메일 혹인 전화번호 인증, 비밀전호 찾기 및 변경, 회원정보 변경을 구글, 페이스북, 네이버 등에 맡기면서 서비스 개발이 좀 더 수월에 지기 때문에 OAuth로 로그인 기능을 구현해 보겠습니다.

구글 로그인

구글 서비스 등록

구글 클라우드 플랫폼(https://console.cloud.google.com)로 이동

[프로젝트 선택] 탭 클릭

[새 프로젝트] 클릭

[프록젝트 이름] 입력 후 [만들기] 클릭

방금 생성한 프로젝트인지 확인 후에 왼쪽 메뉴 탭에서 API 및 서비스 카테고리로 이동

[사용자 인증 정보] 클릭 -> [사용자 인증 정보 만들기] -> OAuth 클라이언트 ID클릭

클라이언트ID가 생성되지 전에 동의 화면 구성이 필요하므로 안내에 따라 [동의 화면 구성] 클릭

내부를 선택하든 외부를 선택하든 모두 프록젝트 관리자의 승인을 받은 계정만 테스트 할 수 있으므로 무엇을 선택하든 문제가 없습니다. 저는 외부 클릭 후 다음으로 넘어가겠습니다.

앱 이름, 사용자 지원 이메일 입력 후 [저장 후 계속] 클릭

[범위 추가 또는 삭제] 클릭 email, profile, openid 선택 후 [업테이트] 클릭 [저장 후 계속]

다음으로 넘어가면 테스트 사용장 이메일 주소를 입력하고 저장하시면 됩니다.
동의화면 설정이 끝났다면 다시 OAuth 클라이언트 ID 클릭하여,

위와 같이 입력해주세요.

application-oauth 등록

application-oauth.properties 생성

src/main/resoures에 application-oauth.properties 생성

좀전에 생성한 클라이언트ID를 클릭하면 부여받은 클라이언트ID와 클라이언트 보안 비밀을 확인할 수 있습니다.

그것을 application-oauth.properties에 입력해주세요

spring.security.oauth2.client.registration.google.client-id=클라이언트ID
spring.security.oauth2.client.registration.google.client-secret=클아이언트 보안 비밀
spring.security.oauth2.client.registration.google.scope=profile,email

application.properties 수정

application.properties에 spring.profiles.include=oauth 을 추가로 작성해 주세요

프로젝트에 연동하기

User클래스 생성 및 작성

  • domain패키지에 user패키지 생성 후 User 클래스 생성

  • 작성

package com.momenting.book.springboot.domain.user;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    @Column
    private  String picture;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Role role;

    @Builder
    public User(String name, String email, String picture, Role role) {
        this.name = name;
        this.email = email;
        this.picture = picture;
        this.role = role;
    }

    public  User update(String name, String picture) {
        this.name = name;
        this.picture = picture;

        return  this;
    }

    public  String getRoleKey() {
        return this.role.getKey();
    }
}
  • @Enumerated(EnumType.STRING)
    JPA로 데이터베이스로 저장할 때 Enum 값을 어떤 형태로 저장할지 결정합니다.
    기본적으로는 int로 된 숫자가 저장됩니다.
    숫자로 저장되면 데이터베이스로 확인할 때 그 값이 무슨 코드를 의미하는지 알 수가 없습니다.
    그래서 문자열로 저장될 수 있도록 선언 합니다.

사용자의 권한을 관리할 Enum 클래스 Role 생성 및 작성

  • user 패키지에 Role Enum클래스 생성

  • 작성

package com.momenting.book.springboot.domain.user;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {

    GUEST("ROLE_GUEST", "방문자"),
    USER("ROLE_USER", "일반 사용자");

    private final  String key;
    private  final String title;
}

User의 CRUD를 책임질 UserRepository 생성 및 작성

  • user 패키지에 UserRepository 인터페이스 생성

  • 작성

package com.momenting.book.springboot.domain.user;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email); // 소셜 로그인으로 반환되는 값중 email을 통해 이미 생성된 사용자인지 처음 가입하는 사용자인지 판단하기위한 메서드
}

스프링 시큐리티 설정을 위한 의존성 추가

  • build.gradle에 스프링 시큐리티 관련 의존성 하나를 추가합니다.
    compile('org.springframework.boot:spring-boot-starter-oauth2client')
profile
순간을 기록하는 개발자

0개의 댓글