mirror of
https://github.com/won-ktds/smarketing-backend.git
synced 2025-12-06 07:06:24 +00:00
feat: member 기능 수정 - 로그인, 로그아웃 토큰 ì, 회원
로그아웃 토큰 ì - 로그그 아웃시 블랙리스트 토큰 적재 과정 삭제, 토큰 삭제만 처리하도록 수정
This commit is contained in:
parent
9ec87678d3
commit
909e51cc4c
@ -52,11 +52,11 @@ public class RecommendationController {
|
|||||||
public ResponseEntity<ApiResponse<Page<MarketingTipResponse>>> getMarketingTipHistory(
|
public ResponseEntity<ApiResponse<Page<MarketingTipResponse>>> getMarketingTipHistory(
|
||||||
@Parameter(description = "매장 ID") @RequestParam Long storeId,
|
@Parameter(description = "매장 ID") @RequestParam Long storeId,
|
||||||
Pageable pageable) {
|
Pageable pageable) {
|
||||||
|
|
||||||
log.info("마케팅 팁 이력 조회: storeId={}, page={}", storeId, pageable.getPageNumber());
|
log.info("마케팅 팁 이력 조회: storeId={}, page={}", storeId, pageable.getPageNumber());
|
||||||
|
|
||||||
Page<MarketingTipResponse> response = marketingTipUseCase.getMarketingTipHistory(storeId, pageable);
|
Page<MarketingTipResponse> response = marketingTipUseCase.getMarketingTipHistory(storeId, pageable);
|
||||||
|
|
||||||
return ResponseEntity.ok(ApiResponse.success(response));
|
return ResponseEntity.ok(ApiResponse.success(response));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,13 +42,6 @@ management:
|
|||||||
health:
|
health:
|
||||||
show-details: always
|
show-details: always
|
||||||
|
|
||||||
springdoc:
|
|
||||||
swagger-ui:
|
|
||||||
path: /swagger-ui.html
|
|
||||||
operations-sorter: method
|
|
||||||
api-docs:
|
|
||||||
path: /api-docs
|
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
level:
|
level:
|
||||||
com.won.smarketing.recommend: ${LOG_LEVEL:DEBUG}
|
com.won.smarketing.recommend: ${LOG_LEVEL:DEBUG}
|
||||||
|
|||||||
@ -36,9 +36,9 @@ public class RegisterRequest {
|
|||||||
@NotBlank(message = "이름은 필수입니다")
|
@NotBlank(message = "이름은 필수입니다")
|
||||||
@Size(max = 50, message = "이름은 50자 이하여야 합니다")
|
@Size(max = 50, message = "이름은 50자 이하여야 합니다")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "사업자등록번호", example = "123-45-67890")
|
@Schema(description = "사업자등록번호", example = "1234567890")
|
||||||
@Pattern(regexp = "^\\d{3}-\\d{2}-\\d{5}$", message = "사업자등록번호 형식이 올바르지 않습니다 (000-00-00000)")
|
@Pattern(regexp = "^\\d{10}$", message = "사업자등록번호는 10자리 숫자여야 합니다")
|
||||||
private String businessNumber;
|
private String businessNumber;
|
||||||
|
|
||||||
@Schema(description = "이메일", example = "user@example.com", required = true)
|
@Schema(description = "이메일", example = "user@example.com", required = true)
|
||||||
|
|||||||
@ -26,7 +26,7 @@ public class Member {
|
|||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column(name = "id")
|
@Column(name = "member_id")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Column(name = "user_id", nullable = false, unique = true, length = 50)
|
@Column(name = "user_id", nullable = false, unique = true, length = 50)
|
||||||
@ -38,7 +38,7 @@ public class Member {
|
|||||||
@Column(name = "name", nullable = false, length = 50)
|
@Column(name = "name", nullable = false, length = 50)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Column(name = "business_number", length = 12)
|
@Column(name = "business_number", length = 15, unique = true)
|
||||||
private String businessNumber;
|
private String businessNumber;
|
||||||
|
|
||||||
@Column(name = "email", nullable = false, unique = true, length = 100)
|
@Column(name = "email", nullable = false, unique = true, length = 100)
|
||||||
|
|||||||
@ -52,6 +52,9 @@ public class AuthServiceImpl implements AuthService {
|
|||||||
|
|
||||||
// 패스워드 검증
|
// 패스워드 검증
|
||||||
if (!passwordEncoder.matches(request.getPassword(), member.getPassword())) {
|
if (!passwordEncoder.matches(request.getPassword(), member.getPassword())) {
|
||||||
|
System.out.println(passwordEncoder.encode(request.getPassword()));
|
||||||
|
System.out.println(passwordEncoder.encode(member.getPassword()));
|
||||||
|
|
||||||
throw new BusinessException(ErrorCode.INVALID_PASSWORD);
|
throw new BusinessException(ErrorCode.INVALID_PASSWORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,6 +62,8 @@ public class AuthServiceImpl implements AuthService {
|
|||||||
String accessToken = jwtTokenProvider.generateAccessToken(member.getUserId());
|
String accessToken = jwtTokenProvider.generateAccessToken(member.getUserId());
|
||||||
String refreshToken = jwtTokenProvider.generateRefreshToken(member.getUserId());
|
String refreshToken = jwtTokenProvider.generateRefreshToken(member.getUserId());
|
||||||
|
|
||||||
|
log.info("{} access token 발급: {}", request.getUserId(), accessToken);
|
||||||
|
|
||||||
// 리프레시 토큰을 Redis에 저장 (7일)
|
// 리프레시 토큰을 Redis에 저장 (7일)
|
||||||
redisTemplate.opsForValue().set(
|
redisTemplate.opsForValue().set(
|
||||||
REFRESH_TOKEN_PREFIX + member.getUserId(),
|
REFRESH_TOKEN_PREFIX + member.getUserId(),
|
||||||
@ -93,17 +98,8 @@ public class AuthServiceImpl implements AuthService {
|
|||||||
if (jwtTokenProvider.validateToken(refreshToken)) {
|
if (jwtTokenProvider.validateToken(refreshToken)) {
|
||||||
String userId = jwtTokenProvider.getUserIdFromToken(refreshToken);
|
String userId = jwtTokenProvider.getUserIdFromToken(refreshToken);
|
||||||
|
|
||||||
// Redis에서 리프레시 토큰 삭제
|
|
||||||
redisTemplate.delete(REFRESH_TOKEN_PREFIX + userId);
|
redisTemplate.delete(REFRESH_TOKEN_PREFIX + userId);
|
||||||
|
|
||||||
// 리프레시 토큰을 블랙리스트에 추가
|
|
||||||
redisTemplate.opsForValue().set(
|
|
||||||
BLACKLIST_PREFIX + refreshToken,
|
|
||||||
"logout",
|
|
||||||
7,
|
|
||||||
TimeUnit.DAYS
|
|
||||||
);
|
|
||||||
|
|
||||||
log.info("로그아웃 완료: {}", userId);
|
log.info("로그아웃 완료: {}", userId);
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
@ -156,13 +152,8 @@ public class AuthServiceImpl implements AuthService {
|
|||||||
TimeUnit.DAYS
|
TimeUnit.DAYS
|
||||||
);
|
);
|
||||||
|
|
||||||
// 기존 리프레시 토큰을 블랙리스트에 추가
|
// 기존 리프레시 토큰 삭제
|
||||||
redisTemplate.opsForValue().set(
|
redisTemplate.delete(REFRESH_TOKEN_PREFIX + userId);
|
||||||
BLACKLIST_PREFIX + refreshToken,
|
|
||||||
"refreshed",
|
|
||||||
7,
|
|
||||||
TimeUnit.DAYS
|
|
||||||
);
|
|
||||||
|
|
||||||
log.info("토큰 갱신 완료: {}", userId);
|
log.info("토큰 갱신 완료: {}", userId);
|
||||||
|
|
||||||
|
|||||||
18
smarketing-java/member/src/main/resources/data.sql
Normal file
18
smarketing-java/member/src/main/resources/data.sql
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
INSERT INTO members (member_id, user_id, password, name, business_number, email, created_at, updated_at)
|
||||||
|
VALUES
|
||||||
|
(DEFAULT, 'testuser1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '김소상', '123-45-67890', 'test1@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'testuser2', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '이점주', '234-56-78901', 'test2@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'testuser3', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '박카페', '345-67-89012', 'test3@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'cafeowner1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '최카페', '456-78-90123', 'cafe@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'restaurant1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '정식당', '567-89-01234', 'restaurant@smarketing.com', NOW(), NOW())
|
||||||
|
ON CONFLICT (user_id) DO NOTHING;
|
||||||
|
|
||||||
|
-- 이메일 중복 방지를 위한 추가 체크
|
||||||
|
INSERT INTO members (member_id, user_id, password, name, business_number, email, created_at, updated_at)
|
||||||
|
VALUES
|
||||||
|
(DEFAULT, 'bakery1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '김베이커리', '678-90-12345', 'bakery@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'chicken1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '한치킨', '789-01-23456', 'chicken@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'pizza1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '이피자', '890-12-34567', 'pizza@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'dessert1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '달디저트', '901-23-45678', 'dessert@smarketing.com', NOW(), NOW()),
|
||||||
|
(DEFAULT, 'beauty1', '$2a$10$27tA6hwHt4N94WzZm/xqv.smgDi3c6cVp.Pu8gVyfqlEdwTPI8r7y', '미뷰티샵', '012-34-56789', 'beauty@smarketing.com', NOW(), NOW())
|
||||||
|
ON CONFLICT (user_id) DO NOTHING;
|
||||||
Loading…
x
Reference in New Issue
Block a user