diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt index 29e59710..11820065 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt @@ -126,7 +126,7 @@ class AdminMemberService( GetAdminMemberListResponseItem( id = it.id!!, - email = it.email, + email = it.email ?: "", nickname = it.nickname, profileUrl = if (it.profileImage != null) { "$cloudFrontHost/${it.profileImage}" @@ -160,6 +160,7 @@ class AdminMemberService( val member = repository.findByIdAndActive(memberId = request.memberId) ?: throw SodaException(messageKey = "admin.member.reset_password_invalid") - member.password = passwordEncoder.encode(member.email.split("@")[0]) + val email = member.email ?: throw SodaException(message = "이메일이 없는 계정은 비밀번호 재설정이 불가능합니다.") + member.password = passwordEncoder.encode(email.split("@")[0]) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempController.kt index b1943d43..7f0ab270 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempController.kt @@ -5,7 +5,6 @@ import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member import org.springframework.security.core.annotation.AuthenticationPrincipal -import org.springframework.security.core.userdetails.User import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -29,6 +28,12 @@ class ChargeTempController(private val service: ChargeTempService) { @PostMapping("/verify") fun verify( @RequestBody request: VerifyRequest, - @AuthenticationPrincipal user: User - ) = ApiResponse.ok(service.verify(user, request)) + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) { + throw SodaException(messageKey = "common.error.bad_credentials") + } + + ApiResponse.ok(service.verify(member, request)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempService.kt index 2eaa248a..4a206375 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/temp/ChargeTempService.kt @@ -15,10 +15,8 @@ import kr.co.vividnext.sodalive.extensions.moneyFormat import kr.co.vividnext.sodalive.i18n.LangContext import kr.co.vividnext.sodalive.i18n.SodaMessageSource import kr.co.vividnext.sodalive.member.Member -import kr.co.vividnext.sodalive.member.MemberRepository import org.springframework.beans.factory.annotation.Value import org.springframework.data.repository.findByIdOrNull -import org.springframework.security.core.userdetails.User import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -26,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional @Transactional(readOnly = true) class ChargeTempService( private val chargeRepository: ChargeRepository, - private val memberRepository: MemberRepository, private val objectMapper: ObjectMapper, private val messageSource: SodaMessageSource, @@ -54,11 +51,9 @@ class ChargeTempService( } @Transactional - fun verify(user: User, verifyRequest: VerifyRequest) { + fun verify(member: Member, verifyRequest: VerifyRequest) { val charge = chargeRepository.findByIdOrNull(verifyRequest.orderId.toLong()) ?: throw SodaException(messageKey = "can.charge.invalid_payment_info") - val member = memberRepository.findByEmail(user.username) - ?: throw SodaException(messageKey = "common.error.bad_credentials") if (charge.payment!!.paymentGateway == PaymentGateway.PG) { val bootpay = Bootpay(bootpayApplicationId, bootpayPrivateKey) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt index 9bfd9b76..d46f1dd5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberService.kt @@ -87,7 +87,7 @@ class CreatorAdminMemberService( userId = member.id!!, token = jwt, nickname = member.nickname, - email = member.email, + email = member.email ?: "", profileImage = if (member.profileImage != null) { "$cloudFrontHost/${member.profileImage}" } else { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt index a30b31c6..49295f15 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt @@ -19,7 +19,7 @@ import javax.persistence.OneToOne @Entity data class Member( - val email: String, + var email: String? = null, var password: String, var nickname: String, var profileImage: String? = null, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberAdapter.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberAdapter.kt index ce42b377..c81e1c20 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberAdapter.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberAdapter.kt @@ -4,7 +4,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.core.userdetails.User class MemberAdapter(val member: Member) : User( - member.email, + member.email ?: "member:${member.id}", member.password, listOf(SimpleGrantedAuthority("ROLE_${member.role.name}")) ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt index 9487cdf2..add3d49d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -20,7 +20,7 @@ import org.springframework.stereotype.Repository @Repository interface MemberRepository : JpaRepository, MemberQueryRepository { - fun findByEmail(email: String): Member? + fun findByEmail(email: String?): Member? fun findByNickname(nickname: String): Member? fun findByGoogleId(googleId: String): Member? fun findByKakaoId(kakaoId: Long): Member? @@ -51,7 +51,7 @@ interface MemberQueryRepository { fun getMessageRecipientPushToken(messageId: Long): PushTokenInfo? fun getIndividualRecipientPushTokens(recipients: List, isAuth: Boolean?): List fun getChangeNicknamePrice(memberId: Long): GetChangeNicknamePriceResponse - fun getMemberByEmail(email: String): Member? + fun getMemberByEmail(email: String?): Member? fun getChangeNoticeRecipientPushTokens(creatorId: Long): List fun getPushTokenFromReservationList(roomId: Long): List @@ -363,7 +363,8 @@ class MemberQueryRepositoryImpl( ) } - override fun getMemberByEmail(email: String): Member? { + override fun getMemberByEmail(email: String?): Member? { + if (email == null) return null return queryFactory .selectFrom(member) .where(member.email.eq(email)) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 5d053cc1..497fe4d5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -346,7 +346,7 @@ class MemberService( userId = member.id!!, token = jwt, nickname = member.nickname, - email = member.email, + email = member.email ?: "", profileImage = if (member.profileImage != null) { "$cloudFrontHost/${member.profileImage}" } else { @@ -454,8 +454,16 @@ class MemberService( } override fun loadUserByUsername(username: String): UserDetails { - val member = repository.findByEmail(email = username) - ?: throw UsernameNotFoundException(username) + val member = if (username.startsWith("member:")) { + val id = username.substringAfter("member:").toLongOrNull() + if (id != null) { + repository.findByIdOrNull(id) + } else { + null + } + } else { + repository.findByEmail(email = username) + } ?: throw UsernameNotFoundException(username) return MemberAdapter(member) } @@ -592,7 +600,7 @@ class MemberService( @Transactional fun signOut(signOutRequest: SignOutRequest, user: User) { - val member = repository.findByEmail(user.username) + val member = findMemberByUsername(user.username) ?: throw SodaException(messageKey = "common.error.bad_credentials") if ( member.provider == MemberProvider.EMAIL && @@ -620,11 +628,7 @@ class MemberService( @Transactional fun updateNickname(profileUpdateRequest: ProfileUpdateRequest, user: User) { - if (profileUpdateRequest.email != user.username) { - throw SodaException(messageKey = "common.error.bad_credentials") - } - - val member = repository.findByEmail(user.username) + val member = findMemberByUsername(user.username) ?: throw SodaException(messageKey = "common.error.bad_credentials") if (profileUpdateRequest.nickname != null) { @@ -652,11 +656,7 @@ class MemberService( @Transactional fun profileUpdate(profileUpdateRequest: ProfileUpdateRequest, user: User): ProfileResponse { - if (profileUpdateRequest.email != user.username) { - throw SodaException(messageKey = "common.error.bad_credentials") - } - - val member = repository.findByEmail(user.username) + val member = findMemberByUsername(user.username) ?: throw SodaException(messageKey = "common.error.bad_credentials") if (profileUpdateRequest.modifyPassword != null) { @@ -729,7 +729,7 @@ class MemberService( @Transactional fun profileImageUpdate(multipartFile: MultipartFile, user: User): String { - val member = repository.findByEmail(user.username) + val member = findMemberByUsername(user.username) ?: throw SodaException(messageKey = "common.error.bad_credentials") val metadata = ObjectMetadata() @@ -932,7 +932,24 @@ class MemberService( return MemberResolveResult(member = member, isNew = true) } - private fun checkEmail(email: String) { + private fun findMemberByUsername(username: String): Member? { + return if (username.startsWith("member:")) { + val id = username.substringAfter("member:").toLongOrNull() + if (id != null) { + repository.findByIdOrNull(id) + } else { + null + } + } else { + repository.findByEmail(email = username) + } + } + + private fun checkEmail(email: String?) { + if (email.isNullOrBlank()) { + return + } + val member = repository.findByEmail(email) if (member != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt index 17ad822c..12475347 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt @@ -17,7 +17,7 @@ data class ProfileResponse( ) { constructor(member: Member, cloudFrontHost: String, container: String) : this( userId = member.id!!, - email = member.email, + email = member.email ?: "", nickname = member.nickname, gender = member.gender, profileUrl = if (member.profileImage != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt index aeaac650..806f00d8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt @@ -1,7 +1,7 @@ package kr.co.vividnext.sodalive.member data class ProfileUpdateRequest( - val email: String, + val email: String? = null, val password: String? = null, val modifyPassword: String? = null, val nickname: String? = null, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleAuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleAuthService.kt index 7d243442..cf2b72f1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleAuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleAuthService.kt @@ -47,7 +47,7 @@ class GoogleAuthService( userId = member.id!!, token = jwt, nickname = member.nickname, - email = member.email, + email = member.email ?: "", profileImage = if (member.profileImage != null) { "$cloudFrontHost/${member.profileImage}" } else { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleService.kt index e6ac4088..c1f3e4c0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleService.kt @@ -3,7 +3,6 @@ package kr.co.vividnext.sodalive.member.social.google import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport import com.google.api.client.json.gson.GsonFactory -import kr.co.vividnext.sodalive.common.SodaException import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Service @@ -27,7 +26,7 @@ class GoogleService( if (token != null) { val payload = token.payload - val email = payload.email ?: throw SodaException(messageKey = "member.social.email_consent_required") + val email = payload.email GoogleUserInfo( sub = payload.subject, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleUserInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleUserInfo.kt index e54db6ad..2d98ebca 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleUserInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/google/GoogleUserInfo.kt @@ -2,6 +2,6 @@ package kr.co.vividnext.sodalive.member.social.google data class GoogleUserInfo( val sub: String, - val email: String, + val email: String?, val name: String? ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoAuthService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoAuthService.kt index bf7c393f..45f96ad8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoAuthService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoAuthService.kt @@ -47,7 +47,7 @@ class KakaoAuthService( userId = member.id!!, token = jwt, nickname = member.nickname, - email = member.email, + email = member.email ?: "", profileImage = if (member.profileImage != null) { "$cloudFrontHost/${member.profileImage}" } else { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoService.kt index 8ad65c56..13d89f07 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoService.kt @@ -1,7 +1,6 @@ package kr.co.vividnext.sodalive.member.social.kakao import com.fasterxml.jackson.databind.ObjectMapper -import kr.co.vividnext.sodalive.common.SodaException import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod @@ -37,7 +36,6 @@ class KakaoService( val id = jsonNode.get("id").asLong() val kakaoAccount = jsonNode.get("kakao_account") val email = kakaoAccount?.get("email")?.asText() - ?: throw SodaException(messageKey = "member.social.kakao_login_failed") val properties = jsonNode.get("properties") val nickname = properties?.get("nickname")?.asText() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoUserInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoUserInfo.kt index 9ddcc199..9c6596ba 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoUserInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/social/kakao/KakaoUserInfo.kt @@ -2,6 +2,6 @@ package kr.co.vividnext.sodalive.member.social.kakao data class KakaoUserInfo( val id: Long, - val email: String, + val email: String?, val nickname: String? ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuController.kt index d9b8e7b8..2e768433 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuController.kt @@ -1,9 +1,10 @@ package kr.co.vividnext.sodalive.menu import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal -import org.springframework.security.core.userdetails.User import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @@ -13,5 +14,13 @@ import org.springframework.web.bind.annotation.RestController class MenuController(private val service: MenuService) { @GetMapping @PreAuthorize("hasAnyRole('AGENT', 'ADMIN', 'CREATOR')") - fun getMenus(@AuthenticationPrincipal user: User) = ApiResponse.ok(service.getMenus(user)) + fun getMenus( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) { + throw SodaException(messageKey = "common.error.bad_credentials") + } + + ApiResponse.ok(service.getMenus(member)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt index 3ebd9d39..957b7bb8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/menu/MenuService.kt @@ -1,18 +1,13 @@ package kr.co.vividnext.sodalive.menu -import kr.co.vividnext.sodalive.common.SodaException -import kr.co.vividnext.sodalive.member.MemberRepository -import org.springframework.security.core.userdetails.User +import kr.co.vividnext.sodalive.member.Member import org.springframework.stereotype.Service @Service class MenuService( - private val repository: MenuRepository, - private val memberRepository: MemberRepository + private val repository: MenuRepository ) { - fun getMenus(user: User): List { - val member = memberRepository.findByEmail(user.username) - ?: throw SodaException(messageKey = "common.error.bad_credentials") + fun getMenus(member: Member): List { return repository.getMenu(member.role) } }