From 1f1275948aa1989587ccbeef0ba03afdc56cb7cc Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 6 Mar 2022 02:51:28 +0900 Subject: [PATCH] =?UTF-8?q?refactor=20:=20OAuth2=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=EC=8B=9C=20OAuth2Type=20=EB=B3=84=EB=A1=9C=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=A0=95=EB=B3=B4=20=EC=96=BB=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfiguration.kt | 14 +++++++----- .../banjjoknim/playground/domain/auth/OAuth2Type.kt | 22 +++++++++++++++++++ .../playground/domain/auth/OAuth2UserInfos.kt | 1 + 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt index 038a9de..e5f4e26 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/config/security/SecurityConfiguration.kt @@ -1,5 +1,6 @@ package com.banjjoknim.playground.config.security +import com.banjjoknim.playground.domain.auth.OAuth2Type import com.banjjoknim.playground.domain.user.User import com.banjjoknim.playground.domain.user.UserRepository import org.springframework.context.annotation.Bean @@ -224,12 +225,15 @@ class PrincipalOAuth2UserService( println("${userRequest.additionalParameters}") // 5.1 버전 이후일 경우. // 강제로 회원가입 진행 + val oAuth2Type = OAuth2Type.findByProvider(userRequest.clientRegistration.registrationId) val oAuth2User = super.loadUser(userRequest) - val provider = userRequest.clientRegistration.registrationId // google - val providerId = oAuth2User.attributes["sub"] // googleId(PK) + val oAuth2UserInfo = oAuth2Type.createOAuth2UserInfo(oAuth2User.attributes) + + val provider = oAuth2UserInfo.getProvider() // 값의 유무로 일반 로그인, OAuth2 로그인을 구분한다. + val providerId = oAuth2UserInfo.getProviderId() val username = "${provider}_${providerId}" // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. val password = passwordEncoder.encode("비밀번호") // OAuth2 로 로그인시, 필요 없지만 그냥 만들어준다. - val email = oAuth2User.attributes["email"] + val email = oAuth2UserInfo.getEmail() val role = "ROLE_USER" // 회원가입 여부 확인 및 저장 @@ -238,10 +242,10 @@ class PrincipalOAuth2UserService( user = User( username = username, password = password, - email = email as String, + email = email, role = role, provider = provider, - providerId = providerId as String + providerId = providerId ) userRepository.save(user) // 회원정보 저장 diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt new file mode 100644 index 0000000..c19f85c --- /dev/null +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2Type.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.playground.domain.auth + +enum class OAuth2Type( + private val provider: String, + private val createUserInfo: (attributes: Map) -> OAuth2UserInfo +) { + GOOGLE("google", { attributes -> GoogleUserInfo(attributes) }), + FACEBOOK("facebook", { attributes -> FacebookUserInfo(attributes) }); + + fun createOAuth2UserInfo(attributes: Map): OAuth2UserInfo { + return createUserInfo(attributes) + } + + companion object { + fun findByProvider(provider: String): OAuth2Type { + return values() + .find { oAuth2Type -> oAuth2Type.provider == provider } + ?: throw IllegalArgumentException("존재하지 않는 OAuth2 인증 타입입니다.") + } + } +} + diff --git a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt index 608cfb5..c145b7f 100644 --- a/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt +++ b/놀이터(예제 코드 작성)/spring-security/src/main/kotlin/com/banjjoknim/playground/domain/auth/OAuth2UserInfos.kt @@ -10,6 +10,7 @@ class GoogleUserInfo( */ private val attributes: Map ) : OAuth2UserInfo { + override fun getProviderId(): String { return attributes["sub"] as String }