회원토큰 처리
- Redis -> Valkey로 이전되도록 수정
This commit is contained in:
		| @@ -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("로그인 정보를 확인해주세요.") | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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> | ||||||
		Reference in New Issue
	
	Block a user