feat(member): AI 캐릭터 회원 로그인을 차단한다

This commit is contained in:
2026-06-12 11:39:57 +09:00
parent 5cf1f7d909
commit f6a07faef2
4 changed files with 103 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.fcm.PushTokenService
import kr.co.vividnext.sodalive.i18n.LangContext import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.jwt.TokenProvider import kr.co.vividnext.sodalive.jwt.TokenProvider
import kr.co.vividnext.sodalive.member.MemberKind
import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.login.LoginRequest
@@ -70,6 +71,10 @@ class CreatorAdminMemberService(
throw SodaException(messageKey = "creator.admin.member.inactive_account") throw SodaException(messageKey = "creator.admin.member.inactive_account")
} }
if (member.memberKind == MemberKind.AI_CHARACTER) {
throw SodaException(messageKey = "common.error.bad_credentials")
}
if (member.role != MemberRole.CREATOR && member.role != MemberRole.AGENT) { if (member.role != MemberRole.CREATOR && member.role != MemberRole.AGENT) {
throw SodaException(messageKey = "common.error.bad_credentials") throw SodaException(messageKey = "common.error.bad_credentials")
} }

View File

@@ -339,6 +339,10 @@ class MemberService(
throw SodaException(messageKey = "member.validation.inactive_account") throw SodaException(messageKey = "member.validation.inactive_account")
} }
if (member.memberKind == MemberKind.AI_CHARACTER) {
throw SodaException(messageKey = "common.error.bad_credentials")
}
if (member.provider != MemberProvider.EMAIL) { if (member.provider != MemberProvider.EMAIL) {
val provider = resolveProviderLabel(member.provider) val provider = resolveProviderLabel(member.provider)
throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider)) throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider))

View File

@@ -0,0 +1,49 @@
package kr.co.vividnext.sodalive.creator.admin.member
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberKind
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.login.LoginRequest
import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ContextConfiguration
import org.springframework.transaction.annotation.Transactional
import javax.persistence.EntityManager
@SpringBootTest
@Transactional
@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class])
class CreatorAdminMemberServiceTest @Autowired constructor(
private val service: CreatorAdminMemberService,
private val memberRepository: MemberRepository,
private val entityManager: EntityManager
) {
@Test
@DisplayName("AI 캐릭터용 Member는 크리에이터 관리자 로그인할 수 없다")
fun shouldRejectAiCharacterMemberCreatorAdminLogin() {
val member = memberRepository.save(
Member(
email = "ai-character-creator-admin@test.com",
password = "",
nickname = "AI 캐릭터 관리자",
role = MemberRole.CREATOR,
memberKind = MemberKind.AI_CHARACTER
)
)
entityManager.flush()
entityManager.clear()
val exception = assertThrows(SodaException::class.java) {
service.login(LoginRequest(email = member.email!!, password = "password"))
}
assertEquals("common.error.bad_credentials", exception.messageKey)
}
}

View File

@@ -0,0 +1,45 @@
package kr.co.vividnext.sodalive.member
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.login.LoginRequest
import kr.co.vividnext.sodalive.support.EmbeddedRedisInitializer
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ContextConfiguration
import org.springframework.transaction.annotation.Transactional
import javax.persistence.EntityManager
@SpringBootTest
@Transactional
@ContextConfiguration(initializers = [EmbeddedRedisInitializer::class])
class MemberServiceTest @Autowired constructor(
private val service: MemberService,
private val memberRepository: MemberRepository,
private val entityManager: EntityManager
) {
@Test
@DisplayName("AI 캐릭터용 Member는 일반 로그인할 수 없다")
fun shouldRejectAiCharacterMemberLoginBeforeAuthentication() {
val member = memberRepository.save(
Member(
email = "ai-character-login@test.com",
password = "",
nickname = "AI 캐릭터 로그인",
role = MemberRole.CREATOR,
memberKind = MemberKind.AI_CHARACTER
)
)
entityManager.flush()
entityManager.clear()
val exception = assertThrows(SodaException::class.java) {
service.login(LoginRequest(email = member.email!!, password = "password"))
}
assertEquals("common.error.bad_credentials", exception.messageKey)
}
}