Merge pull request #8 from ktds-dg0501/feature/user

UserPricipal 충돌 부분 조치
This commit is contained in:
hyeda2020 2025-10-27 15:28:05 +09:00 committed by GitHub
commit 8323b795df
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 8 deletions

View File

@ -56,13 +56,14 @@ public class JwtTokenProvider {
* @param roles 역할 목록 * @param roles 역할 목록
* @return Access Token * @return Access Token
*/ */
public String createAccessToken(UUID userId, UUID storeId, String email, String name, List<String> roles) {
public String createAccessToken(Long userId, Long storeId, String email, String name, List<String> roles) {
Date now = new Date(); Date now = new Date();
Date expiryDate = new Date(now.getTime() + accessTokenValidityMs); Date expiryDate = new Date(now.getTime() + accessTokenValidityMs);
return Jwts.builder() return Jwts.builder()
.subject(userId.toString()) .subject(userId.toString())
.claim("storeId", storeId.toString()) .claim("storeId", storeId != null ? storeId.toString() : null)
.claim("email", email) .claim("email", email)
.claim("name", name) .claim("name", name)
.claim("roles", roles) .claim("roles", roles)
@ -112,8 +113,9 @@ public class JwtTokenProvider {
public UserPrincipal getUserPrincipalFromToken(String token) { public UserPrincipal getUserPrincipalFromToken(String token) {
Claims claims = parseToken(token); Claims claims = parseToken(token);
UUID userId = UUID.fromString(claims.getSubject()); Long userId = Long.parseLong(claims.getSubject());
UUID storeId = UUID.fromString(claims.get("storeId", String.class)); String storeIdStr = claims.get("storeId", String.class);
Long storeId = storeIdStr != null ? Long.parseLong(storeIdStr) : null;
String email = claims.get("email", String.class); String email = claims.get("email", String.class);
String name = claims.get("name", String.class); String name = claims.get("name", String.class);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@ -31,6 +31,11 @@ public class UserPrincipal implements UserDetails {
*/ */
private final UUID storeId; private final UUID storeId;
/**
* 매장 ID
*/
private final Long storeId;
/** /**
* 사용자 이메일 * 사용자 이메일
*/ */

View File

@ -5,8 +5,10 @@ import com.kt.event.common.security.JwtTokenProvider;
import com.kt.event.user.dto.request.LoginRequest; import com.kt.event.user.dto.request.LoginRequest;
import com.kt.event.user.dto.response.LoginResponse; import com.kt.event.user.dto.response.LoginResponse;
import com.kt.event.user.dto.response.LogoutResponse; import com.kt.event.user.dto.response.LogoutResponse;
import com.kt.event.user.entity.Store;
import com.kt.event.user.entity.User; import com.kt.event.user.entity.User;
import com.kt.event.user.exception.UserErrorCode; import com.kt.event.user.exception.UserErrorCode;
import com.kt.event.user.repository.StoreRepository;
import com.kt.event.user.repository.UserRepository; import com.kt.event.user.repository.UserRepository;
import com.kt.event.user.service.AuthenticationService; import com.kt.event.user.service.AuthenticationService;
import com.kt.event.user.service.UserService; import com.kt.event.user.service.UserService;
@ -34,6 +36,7 @@ import java.util.concurrent.TimeUnit;
public class AuthenticationServiceImpl implements AuthenticationService { public class AuthenticationServiceImpl implements AuthenticationService {
private final UserRepository userRepository; private final UserRepository userRepository;
private final StoreRepository storeRepository;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
private final JwtTokenProvider jwtTokenProvider; private final JwtTokenProvider jwtTokenProvider;
private final UserService userService; private final UserService userService;
@ -42,10 +45,12 @@ public class AuthenticationServiceImpl implements AuthenticationService {
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
public AuthenticationServiceImpl(UserRepository userRepository, public AuthenticationServiceImpl(UserRepository userRepository,
StoreRepository storeRepository,
PasswordEncoder passwordEncoder, PasswordEncoder passwordEncoder,
JwtTokenProvider jwtTokenProvider, JwtTokenProvider jwtTokenProvider,
UserService userService) { UserService userService) {
this.userRepository = userRepository; this.userRepository = userRepository;
this.storeRepository = storeRepository;
this.passwordEncoder = passwordEncoder; this.passwordEncoder = passwordEncoder;
this.jwtTokenProvider = jwtTokenProvider; this.jwtTokenProvider = jwtTokenProvider;
this.userService = userService; this.userService = userService;
@ -68,21 +73,26 @@ public class AuthenticationServiceImpl implements AuthenticationService {
throw new BusinessException(UserErrorCode.AUTH_FAILED.getErrorCode()); throw new BusinessException(UserErrorCode.AUTH_FAILED.getErrorCode());
} }
// 3. JWT 토큰 생성 // 3. 매장 정보 조회
Store store = storeRepository.findByUserId(user.getId()).orElse(null);
Long storeId = store != null ? store.getId() : null;
// 4. JWT 토큰 생성
String token = jwtTokenProvider.createAccessToken( String token = jwtTokenProvider.createAccessToken(
user.getId(), user.getId(),
storeId,
user.getEmail(), user.getEmail(),
user.getName(), user.getName(),
List.of(user.getRole().name()) List.of(user.getRole().name())
); );
// 4. Redis 세션 저장 (TTL 7일) // 5. Redis 세션 저장 (TTL 7일)
saveSession(token, user.getId(), user.getRole().name()); saveSession(token, user.getId(), user.getRole().name());
// 5. 최종 로그인 시각 업데이트 (비동기) // 6. 최종 로그인 시각 업데이트 (비동기)
userService.updateLastLoginAt(user.getId()); userService.updateLastLoginAt(user.getId());
// 6. 응답 반환 // 7. 응답 반환
return LoginResponse.builder() return LoginResponse.builder()
.token(token) .token(token)
.userId(user.getId()) .userId(user.getId())

View File

@ -103,6 +103,7 @@ public class UserServiceImpl implements UserService {
// 6. JWT 토큰 생성 // 6. JWT 토큰 생성
String token = jwtTokenProvider.createAccessToken( String token = jwtTokenProvider.createAccessToken(
savedUser.getId(), savedUser.getId(),
savedStore.getId(),
savedUser.getEmail(), savedUser.getEmail(),
savedUser.getName(), savedUser.getName(),
List.of(savedUser.getRole().name()) List.of(savedUser.getRole().name())