회원토큰 처리

- Redis -> Valkey로 이전되도록 수정
This commit is contained in:
Klaus 2024-11-22 21:22:02 +09:00
parent 157e3a39b6
commit 68472b234e
4 changed files with 72 additions and 14 deletions

View File

@ -7,7 +7,9 @@ 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
import kr.co.vividnext.sodalive.member.login.LoginResponse import kr.co.vividnext.sodalive.member.login.LoginResponse
import kr.co.vividnext.sodalive.member.token.MemberToken
import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.member.token.MemberTokenRepository
import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
@ -22,6 +24,7 @@ import kotlin.concurrent.write
class CreatorAdminMemberService( class CreatorAdminMemberService(
private val repository: MemberRepository, private val repository: MemberRepository,
private val tokenRepository: MemberTokenRepository, private val tokenRepository: MemberTokenRepository,
private val tokenRepositoryV2: MemberTokenRepositoryV2,
private val tokenProvider: TokenProvider, private val tokenProvider: TokenProvider,
private val authenticationManagerBuilder: AuthenticationManagerBuilder, private val authenticationManagerBuilder: AuthenticationManagerBuilder,
@ -47,13 +50,29 @@ class CreatorAdminMemberService(
val lock = getOrCreateLock(memberId = memberId) val lock = getOrCreateLock(memberId = memberId)
lock.write { lock.write {
val memberToken = tokenRepository.findByIdOrNull(memberId) val memberToken = saveAndGetTokenById(memberId)
?: throw SodaException("로그인 정보를 확인해주세요.")
if (memberToken != null) {
memberToken.tokenSet.remove(token) memberToken.tokenSet.remove(token)
tokenRepository.save(memberToken) tokenRepositoryV2.save(memberToken)
} }
} }
}
private fun saveAndGetTokenById(id: Long): MemberToken? {
var memberToken = tokenRepositoryV2.findByIdOrNull(id = id)
if (memberToken == null) {
memberToken = tokenRepository.findByIdOrNull(id = id)
if (memberToken != null) {
tokenRepositoryV2.save(memberToken)
tokenRepository.delete(memberToken)
}
}
return memberToken
}
private fun login(email: String, password: String): LoginResponse { private fun login(email: String, password: String): LoginResponse {
val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.") val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.")

View File

@ -13,6 +13,7 @@ import kr.co.vividnext.sodalive.member.MemberAdapter
import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.token.MemberToken import kr.co.vividnext.sodalive.member.token.MemberToken
import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.member.token.MemberTokenRepository
import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.InitializingBean
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
@ -35,7 +36,8 @@ class TokenProvider(
@Value("\${jwt.token-validity-in-seconds}") @Value("\${jwt.token-validity-in-seconds}")
private val tokenValidityInSeconds: Long, private val tokenValidityInSeconds: Long,
private val repository: MemberRepository, private val repository: MemberRepository,
private val tokenRepository: MemberTokenRepository private val tokenRepository: MemberTokenRepository,
private val tokenRepositoryV2: MemberTokenRepositoryV2
) : InitializingBean { ) : InitializingBean {
private val logger = LoggerFactory.getLogger(TokenProvider::class.java) private val logger = LoggerFactory.getLogger(TokenProvider::class.java)
@ -65,11 +67,11 @@ class TokenProvider(
val lock = getOrCreateLock(memberId = memberId) val lock = getOrCreateLock(memberId = memberId)
lock.write { lock.write {
val memberToken = tokenRepository.findByIdOrNull(memberId) val memberToken = saveAndGetTokenById(memberId)
?: MemberToken(id = memberId) ?: MemberToken(id = memberId)
memberToken.tokenSet.add(token) memberToken.tokenSet.add(token)
tokenRepository.save(memberToken) tokenRepositoryV2.save(memberToken)
} }
return token return token
@ -84,7 +86,7 @@ class TokenProvider(
.body .body
val authorities = claims[AUTHORITIES_KEY].toString().split(",").map { SimpleGrantedAuthority(it) } val authorities = claims[AUTHORITIES_KEY].toString().split(",").map { SimpleGrantedAuthority(it) }
val memberToken = tokenRepository.findByIdOrNull(id = claims.subject.toLong()) val memberToken = saveAndGetTokenById(id = claims.subject.toLong())
?: throw SodaException("로그인 정보를 확인해주세요.") ?: throw SodaException("로그인 정보를 확인해주세요.")
if (!memberToken.tokenSet.contains(token)) throw SodaException("로그인 정보를 확인해주세요.") if (!memberToken.tokenSet.contains(token)) throw SodaException("로그인 정보를 확인해주세요.")
@ -96,6 +98,21 @@ class TokenProvider(
return UsernamePasswordAuthenticationToken(principal, token, authorities) return UsernamePasswordAuthenticationToken(principal, token, authorities)
} }
private fun saveAndGetTokenById(id: Long): MemberToken? {
var memberToken = tokenRepositoryV2.findByIdOrNull(id = id)
if (memberToken == null) {
memberToken = tokenRepository.findByIdOrNull(id = id)
if (memberToken != null) {
tokenRepositoryV2.save(memberToken)
tokenRepository.delete(memberToken)
}
}
return memberToken
}
fun validateToken(token: String): Boolean { fun validateToken(token: String): Boolean {
try { try {
Jwts.parserBuilder() Jwts.parserBuilder()

View File

@ -35,9 +35,11 @@ import kr.co.vividnext.sodalive.member.stipulation.StipulationIds
import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository import kr.co.vividnext.sodalive.member.stipulation.StipulationRepository
import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag
import kr.co.vividnext.sodalive.member.tag.MemberTagRepository import kr.co.vividnext.sodalive.member.tag.MemberTagRepository
import kr.co.vividnext.sodalive.member.token.MemberToken
import kr.co.vividnext.sodalive.member.token.MemberTokenRepository import kr.co.vividnext.sodalive.member.token.MemberTokenRepository
import kr.co.vividnext.sodalive.utils.generateFileName import kr.co.vividnext.sodalive.utils.generateFileName
import kr.co.vividnext.sodalive.utils.generatePassword import kr.co.vividnext.sodalive.utils.generatePassword
import kr.co.vividnext.sodalive.v2.MemberTokenRepositoryV2
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
@ -62,6 +64,7 @@ import kotlin.concurrent.write
class MemberService( class MemberService(
private val repository: MemberRepository, private val repository: MemberRepository,
private val tokenRepository: MemberTokenRepository, private val tokenRepository: MemberTokenRepository,
private val tokenRepositoryV2: MemberTokenRepositoryV2,
private val stipulationRepository: StipulationRepository, private val stipulationRepository: StipulationRepository,
private val stipulationAgreeRepository: StipulationAgreeRepository, private val stipulationAgreeRepository: StipulationAgreeRepository,
private val creatorFollowingRepository: CreatorFollowingRepository, private val creatorFollowingRepository: CreatorFollowingRepository,
@ -435,11 +438,12 @@ class MemberService(
val lock = getOrCreateLock(memberId = memberId) val lock = getOrCreateLock(memberId = memberId)
lock.write { lock.write {
val memberToken = tokenRepository.findByIdOrNull(memberId) val memberToken = saveAndGetTokenById(memberId)
?: throw SodaException("로그인 정보를 확인해주세요.")
if (memberToken != null) {
memberToken.tokenSet.remove(token) memberToken.tokenSet.remove(token)
tokenRepository.save(memberToken) tokenRepositoryV2.save(memberToken)
}
} }
} }
@ -451,7 +455,25 @@ class MemberService(
member.pushToken = null member.pushToken = null
val lock = getOrCreateLock(memberId = memberId) val lock = getOrCreateLock(memberId = memberId)
lock.write { tokenRepository.deleteById(memberId) } lock.write {
tokenRepository.deleteById(memberId)
tokenRepositoryV2.deleteById(memberId)
}
}
private fun saveAndGetTokenById(id: Long): MemberToken? {
var memberToken = tokenRepositoryV2.findByIdOrNull(id = id)
if (memberToken == null) {
memberToken = tokenRepository.findByIdOrNull(id = id)
if (memberToken != null) {
tokenRepositoryV2.save(memberToken)
tokenRepository.delete(memberToken)
}
}
return memberToken
} }
@Transactional @Transactional

View File

@ -5,4 +5,4 @@ import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
@Repository @Repository
interface NewMemberTokenRepository : CrudRepository<MemberToken, Long> interface MemberTokenRepositoryV2 : CrudRepository<MemberToken, Long>