From e0e24be68837e137c36bd4e46150e656c31a84cd Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 16:29:23 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/member/auth/AuthController.kt | 2 +- .../sodalive/member/auth/AuthService.kt | 37 ++++++++++++++++++- .../sodalive/member/auth/BlockAuth.kt | 19 ++++++++++ .../member/auth/BlockAuthRepository.kt | 27 ++++++++++++++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuth.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuthRepository.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt index 764a24e..8a7cecc 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt @@ -19,6 +19,6 @@ class AuthController(private val service: AuthService) { ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.verify(member, request)) + ApiResponse.ok(service.verify(member.id!!, request)) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index a7a09f3..d3f66f0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -4,7 +4,12 @@ import com.fasterxml.jackson.databind.ObjectMapper import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.member.MemberService +import kr.co.vividnext.sodalive.member.SignOut +import kr.co.vividnext.sodalive.member.SignOutRepository import org.springframework.beans.factory.annotation.Value +import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.time.LocalDate @@ -14,17 +19,25 @@ import java.time.LocalDate class AuthService( private val repository: AuthRepository, private val objectMapper: ObjectMapper, + private val blockAuthRepository: BlockAuthRepository, + + private val memberService: MemberService, + private val memberRepository: MemberRepository, + private val signOutRepository: SignOutRepository, @Value("\${bootpay.application-id}") private val bootpayApplicationId: String, @Value("\${bootpay.private-key}") private val bootpayPrivateKey: String ) { + private val blockMessage = "운영정책을 위반하여 이용을 제한합니다." + @Transactional - fun verify(member: Member, request: AuthVerifyRequest) { + fun verify(memberId: Long, request: AuthVerifyRequest) { + val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") val bootpay = Bootpay(bootpayApplicationId, bootpayPrivateKey) - val authId = repository.getAuthIdByMemberId(memberId = member.id!!) + val authId = repository.getAuthIdByMemberId(memberId = memberId) if (authId != null) throw SodaException("이미 인증된 계정입니다.") try { @@ -42,6 +55,12 @@ class AuthService( val certificate = certificateResult.authenticateData val nowYear = LocalDate.now().year val certificateYear = certificate.birth.substring(0, 4).toInt() + + if (isBlockAuth(certificate)) { + signOut(member) + throw SodaException(blockMessage) + } + if (nowYear - certificateYear >= 19) { val memberIds = repository.getActiveMemberIdsByDi(di = certificate.di) if (memberIds.size >= 3) { @@ -71,4 +90,18 @@ class AuthService( throw SodaException(e.message ?: "인증정보에 오류가 있습니다.\n다시 시도해 주세요.") } } + + private fun isBlockAuth(certificate: AuthVerifyCertificate): Boolean { + val blockAuthId = blockAuthRepository.findByUniqueCiAndDi(certificate.unique, certificate.di) + return blockAuthId != null && blockAuthId > 0 + } + + private fun signOut(member: Member) { + memberService.logoutAll(memberId = member.id!!) + member.isActive = false + + val signOut = SignOut(reason = blockMessage) + signOut.member = member + signOutRepository.save(signOut) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuth.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuth.kt new file mode 100644 index 0000000..4bd2d4a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuth.kt @@ -0,0 +1,19 @@ +package kr.co.vividnext.sodalive.member.auth + +import kr.co.vividnext.sodalive.common.BaseEntity +import javax.persistence.Column +import javax.persistence.Entity + +@Entity +data class BlockAuth( + @Column(nullable = false) + val name: String, + @Column(nullable = false) + val birth: String, + @Column(columnDefinition = "TEXT", nullable = false) + val uniqueCi: String, + @Column(columnDefinition = "TEXT", nullable = false) + val di: String, + @Column(nullable = false) + val gender: Int +) : BaseEntity() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuthRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuthRepository.kt new file mode 100644 index 0000000..ee36a52 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/BlockAuthRepository.kt @@ -0,0 +1,27 @@ +package kr.co.vividnext.sodalive.member.auth + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.member.auth.QBlockAuth.blockAuth +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +@Repository +interface BlockAuthRepository : JpaRepository, BlockAuthQueryRepository + +interface BlockAuthQueryRepository { + fun findByUniqueCiAndDi(uniqueCi: String, di: String): Long? +} + +@Repository +class BlockAuthQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : BlockAuthQueryRepository { + override fun findByUniqueCiAndDi(uniqueCi: String, di: String): Long? { + return queryFactory + .select(blockAuth.id) + .from(blockAuth) + .where( + blockAuth.uniqueCi.eq(uniqueCi) + .and(blockAuth.di.eq(di)) + ) + .fetchFirst() + } +} From 1eeea16792000674f306dc30b793ec4d4feb6683 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 16:38:21 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/member/auth/AuthService.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index d3f66f0..cbc3e30 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -58,6 +58,7 @@ class AuthService( if (isBlockAuth(certificate)) { signOut(member) + member.isActive = false throw SodaException(blockMessage) } @@ -96,9 +97,9 @@ class AuthService( return blockAuthId != null && blockAuthId > 0 } - private fun signOut(member: Member) { + @Transactional() + fun signOut(member: Member) { memberService.logoutAll(memberId = member.id!!) - member.isActive = false val signOut = SignOut(reason = blockMessage) signOut.member = member From 6bc5143471f763f3fd0c0548f1a2978ca4b125b3 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 17:17:58 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/member/auth/AuthService.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index cbc3e30..c912c4b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -3,7 +3,6 @@ package kr.co.vividnext.sodalive.member.auth import com.fasterxml.jackson.databind.ObjectMapper import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.common.SodaException -import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberService import kr.co.vividnext.sodalive.member.SignOut @@ -11,6 +10,7 @@ import kr.co.vividnext.sodalive.member.SignOutRepository import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional import java.time.LocalDate @@ -57,8 +57,7 @@ class AuthService( val certificateYear = certificate.birth.substring(0, 4).toInt() if (isBlockAuth(certificate)) { - signOut(member) - member.isActive = false + signOut(memberId = memberId) throw SodaException(blockMessage) } @@ -97,12 +96,15 @@ class AuthService( return blockAuthId != null && blockAuthId > 0 } - @Transactional() - fun signOut(member: Member) { - memberService.logoutAll(memberId = member.id!!) + @Transactional(propagation = Propagation.REQUIRES_NEW) + fun signOut(memberId: Long) { + val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") + member.isActive = false val signOut = SignOut(reason = blockMessage) signOut.member = member signOutRepository.save(signOut) + + memberService.logoutAll(memberId = member.id!!) } } From 75140a405555d72a6828129cea06931ad01e660e Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 17:32:10 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/member/auth/AuthService.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index c912c4b..67d7323 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -57,7 +57,10 @@ class AuthService( val certificateYear = certificate.birth.substring(0, 4).toInt() if (isBlockAuth(certificate)) { - signOut(memberId = memberId) + try { + signOut(memberId = memberId) + } catch (_: Exception) { + } throw SodaException(blockMessage) } From 60012a7aad3abced6c3555c50f9a53ce46e45b03 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 18:15:56 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/member/auth/AuthService.kt | 92 ++++++++++--------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index 67d7323..585f7c4 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -40,58 +40,60 @@ class AuthService( val authId = repository.getAuthIdByMemberId(memberId = memberId) if (authId != null) throw SodaException("이미 인증된 계정입니다.") - try { + val certificateResult: AuthCertificateResult = try { val token = bootpay.accessToken if (token["error_code"] != null) throw SodaException("인증정보에 오류가 있습니다.\n다시 시도해 주세요.") val res = bootpay.certificate(request.receiptId) - val certificateResult = objectMapper.convertValue(res, AuthCertificateResult::class.java) - - if ( - certificateResult.status == 12 && - certificateResult.statusLocale == "본인인증완료" && - certificateResult.receiptId == request.receiptId - ) { - val certificate = certificateResult.authenticateData - val nowYear = LocalDate.now().year - val certificateYear = certificate.birth.substring(0, 4).toInt() - - if (isBlockAuth(certificate)) { - try { - signOut(memberId = memberId) - } catch (_: Exception) { - } - throw SodaException(blockMessage) - } - - if (nowYear - certificateYear >= 19) { - val memberIds = repository.getActiveMemberIdsByDi(di = certificate.di) - if (memberIds.size >= 3) { - throw SodaException( - "이미 본인인증한 계정 ${memberIds.size}개 이용중입니다.\n" + - "소다라이브의 본인인증은 최대 3개의 계정만 이용할 수 있습니다." - ) - } - - val auth = Auth( - name = certificate.name, - birth = certificate.birth, - uniqueCi = certificate.unique, - di = certificate.di, - gender = certificate.gender - ) - auth.member = member - - repository.save(auth) - } else { - throw SodaException("19세 미만 인증 오류") - } - } else { - throw SodaException("인증정보에 오류가 있습니다.\n다시 시도해 주세요.") - } + objectMapper.convertValue(res, AuthCertificateResult::class.java) } catch (e: Exception) { throw SodaException(e.message ?: "인증정보에 오류가 있습니다.\n다시 시도해 주세요.") } + + if ( + certificateResult.status == 12 && + certificateResult.statusLocale == "본인인증완료" && + certificateResult.receiptId == request.receiptId + ) { + val certificate = certificateResult.authenticateData + + if (isBlockAuth(certificate)) { + try { + signOut(memberId = memberId) + } catch (_: Exception) { + } + + throw SodaException(blockMessage) + } + + val nowYear = LocalDate.now().year + val certificateYear = certificate.birth.substring(0, 4).toInt() + + if (nowYear - certificateYear >= 19) { + val memberIds = repository.getActiveMemberIdsByDi(di = certificate.di) + if (memberIds.size >= 3) { + throw SodaException( + "이미 본인인증한 계정 ${memberIds.size}개 이용중입니다.\n" + + "소다라이브의 본인인증은 최대 3개의 계정만 이용할 수 있습니다." + ) + } + + val auth = Auth( + name = certificate.name, + birth = certificate.birth, + uniqueCi = certificate.unique, + di = certificate.di, + gender = certificate.gender + ) + auth.member = member + + repository.save(auth) + } else { + throw SodaException("19세 미만 인증 오류") + } + } else { + throw SodaException("인증정보에 오류가 있습니다.\n다시 시도해 주세요.") + } } private fun isBlockAuth(certificate: AuthVerifyCertificate): Boolean { From 8be8d15e4c51abe2768ff9dfce44f9c0cd303aa6 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 18:42:32 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/member/auth/AuthService.kt | 89 +++++++++---------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index 585f7c4..b0e1d8f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -10,7 +10,6 @@ import kr.co.vividnext.sodalive.member.SignOutRepository import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional import java.time.LocalDate @@ -32,9 +31,7 @@ class AuthService( ) { private val blockMessage = "운영정책을 위반하여 이용을 제한합니다." - @Transactional fun verify(memberId: Long, request: AuthVerifyRequest) { - val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") val bootpay = Bootpay(bootpayApplicationId, bootpayPrivateKey) val authId = repository.getAuthIdByMemberId(memberId = memberId) @@ -56,60 +53,62 @@ class AuthService( certificateResult.receiptId == request.receiptId ) { val certificate = certificateResult.authenticateData - - if (isBlockAuth(certificate)) { - try { - signOut(memberId = memberId) - } catch (_: Exception) { - } - + if (!checkBlockAuth(certificate, memberId)) { throw SodaException(blockMessage) - } - - val nowYear = LocalDate.now().year - val certificateYear = certificate.birth.substring(0, 4).toInt() - - if (nowYear - certificateYear >= 19) { - val memberIds = repository.getActiveMemberIdsByDi(di = certificate.di) - if (memberIds.size >= 3) { - throw SodaException( - "이미 본인인증한 계정 ${memberIds.size}개 이용중입니다.\n" + - "소다라이브의 본인인증은 최대 3개의 계정만 이용할 수 있습니다." - ) - } - - val auth = Auth( - name = certificate.name, - birth = certificate.birth, - uniqueCi = certificate.unique, - di = certificate.di, - gender = certificate.gender - ) - auth.member = member - - repository.save(auth) } else { - throw SodaException("19세 미만 인증 오류") + val nowYear = LocalDate.now().year + val certificateYear = certificate.birth.substring(0, 4).toInt() + + if (nowYear - certificateYear >= 19) { + authenticate(certificate, memberId) + } else { + throw SodaException("19세 미만 인증 오류") + } } } else { throw SodaException("인증정보에 오류가 있습니다.\n다시 시도해 주세요.") } } - private fun isBlockAuth(certificate: AuthVerifyCertificate): Boolean { + @Transactional + fun checkBlockAuth(certificate: AuthVerifyCertificate, memberId: Long): Boolean { val blockAuthId = blockAuthRepository.findByUniqueCiAndDi(certificate.unique, certificate.di) - return blockAuthId != null && blockAuthId > 0 + if (blockAuthId != null && blockAuthId > 0) { + val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") + member.isActive = false + + val signOut = SignOut(reason = blockMessage) + signOut.member = member + signOutRepository.save(signOut) + + memberService.logoutAll(memberId = member.id!!) + + return true + } + + return false } - @Transactional(propagation = Propagation.REQUIRES_NEW) - fun signOut(memberId: Long) { + @Transactional + fun authenticate(certificate: AuthVerifyCertificate, memberId: Long) { + val memberIds = repository.getActiveMemberIdsByDi(di = certificate.di) + if (memberIds.size >= 3) { + throw SodaException( + "이미 본인인증한 계정 ${memberIds.size}개 이용중입니다.\n" + + "소다라이브의 본인인증은 최대 3개의 계정만 이용할 수 있습니다." + ) + } + val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") - member.isActive = false + val auth = Auth( + name = certificate.name, + birth = certificate.birth, + uniqueCi = certificate.unique, + di = certificate.di, + gender = certificate.gender + ) + auth.member = member - val signOut = SignOut(reason = blockMessage) - signOut.member = member - signOutRepository.save(signOut) - - memberService.logoutAll(memberId = member.id!!) + repository.save(auth) } } From 615164e488bd1a01590697f97fc1dc54ffc55a6e Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 18:50:43 +0900 Subject: [PATCH 07/10] =?UTF-8?q?Service=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EC=97=90=20=EC=A0=81=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=96=B4=20=EC=9E=88=EB=8A=94=20Transactional(readOnly=3Dtrue)?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index b0e1d8f..9f0a9c3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -14,7 +14,6 @@ import org.springframework.transaction.annotation.Transactional import java.time.LocalDate @Service -@Transactional(readOnly = true) class AuthService( private val repository: AuthRepository, private val objectMapper: ObjectMapper, From 1a6a833b93dbd39a7fca952bb3cdf7614d7b9588 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 19:49:31 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/member/auth/AuthController.kt | 10 ++++- .../sodalive/member/auth/AuthService.kt | 41 ++++++------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt index 8a7cecc..1d0ea2e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt @@ -19,6 +19,14 @@ class AuthController(private val service: AuthService) { ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.verify(member.id!!, request)) + val authenticateData = service.certificate(request, memberId = member.id!!) + + if (service.isBlockAuth(authenticateData)) { + service.signOut(member.id!!) + } else { + service.authenticate(authenticateData, member.id!!) + } + + ApiResponse.ok(null, null) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index 9f0a9c3..bebc52e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.time.LocalDate @Service class AuthService( @@ -30,7 +29,7 @@ class AuthService( ) { private val blockMessage = "운영정책을 위반하여 이용을 제한합니다." - fun verify(memberId: Long, request: AuthVerifyRequest) { + fun certificate(request: AuthVerifyRequest, memberId: Long): AuthVerifyCertificate { val bootpay = Bootpay(bootpayApplicationId, bootpayPrivateKey) val authId = repository.getAuthIdByMemberId(memberId = memberId) @@ -51,41 +50,27 @@ class AuthService( certificateResult.statusLocale == "본인인증완료" && certificateResult.receiptId == request.receiptId ) { - val certificate = certificateResult.authenticateData - if (!checkBlockAuth(certificate, memberId)) { - throw SodaException(blockMessage) - } else { - val nowYear = LocalDate.now().year - val certificateYear = certificate.birth.substring(0, 4).toInt() - - if (nowYear - certificateYear >= 19) { - authenticate(certificate, memberId) - } else { - throw SodaException("19세 미만 인증 오류") - } - } + return certificateResult.authenticateData } else { throw SodaException("인증정보에 오류가 있습니다.\n다시 시도해 주세요.") } } - @Transactional - fun checkBlockAuth(certificate: AuthVerifyCertificate, memberId: Long): Boolean { + fun isBlockAuth(certificate: AuthVerifyCertificate): Boolean { val blockAuthId = blockAuthRepository.findByUniqueCiAndDi(certificate.unique, certificate.di) - if (blockAuthId != null && blockAuthId > 0) { - val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") - member.isActive = false + return blockAuthId != null && blockAuthId > 0 + } - val signOut = SignOut(reason = blockMessage) - signOut.member = member - signOutRepository.save(signOut) + @Transactional + fun signOut(memberId: Long) { + val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") + member.isActive = false - memberService.logoutAll(memberId = member.id!!) + val signOut = SignOut(reason = blockMessage) + signOut.member = member + signOutRepository.save(signOut) - return true - } - - return false + memberService.logoutAll(memberId = memberId) } @Transactional From bfedc448afc448678392192137d9a0bed14e6706 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 19:58:04 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index bebc52e..75ad9f3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -71,6 +71,8 @@ class AuthService( signOutRepository.save(signOut) memberService.logoutAll(memberId = memberId) + + throw SodaException("운영정책을 위반하여 이용을 제한합니다.") } @Transactional From ad295564de9ac3ba26482f8ce8ebc292a569dc4b Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 9 Nov 2023 20:06:56 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20:?= =?UTF-8?q?=20block=20=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A1=9C=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=EB=8F=84=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20-=20=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EA=B3=84=EC=A0=95=20=ED=83=88=ED=87=B4=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/member/auth/AuthController.kt | 1 + .../kr/co/vividnext/sodalive/member/auth/AuthService.kt | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt index 1d0ea2e..e0bc549 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthController.kt @@ -23,6 +23,7 @@ class AuthController(private val service: AuthService) { if (service.isBlockAuth(authenticateData)) { service.signOut(member.id!!) + throw SodaException("운영정책을 위반하여 이용을 제한합니다.") } else { service.authenticate(authenticateData, member.id!!) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt index 75ad9f3..edfffe6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthService.kt @@ -27,8 +27,6 @@ class AuthService( @Value("\${bootpay.private-key}") private val bootpayPrivateKey: String ) { - private val blockMessage = "운영정책을 위반하여 이용을 제한합니다." - fun certificate(request: AuthVerifyRequest, memberId: Long): AuthVerifyCertificate { val bootpay = Bootpay(bootpayApplicationId, bootpayPrivateKey) @@ -66,13 +64,11 @@ class AuthService( val member = memberRepository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.") member.isActive = false - val signOut = SignOut(reason = blockMessage) + val signOut = SignOut(reason = "운영정책을 위반하여 이용을 제한합니다.") signOut.member = member signOutRepository.save(signOut) memberService.logoutAll(memberId = memberId) - - throw SodaException("운영정책을 위반하여 이용을 제한합니다.") } @Transactional