인증된 사용자 확인 및 권한 검증을 위한 유틸리티 클래스.
@Component
public class AuthenticationUtil {
/**
* 현재 인증된 사용자의 이메일 반환
*
* @return 인증된 사용자 이메일
*/
public String getCurrentUserEmail() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
throw new CustomException(ErrorCode.UNAUTHORIZED);
}
return authentication.getName();
}
/**
* 현재 인증된 사용자가 해당 ID의 소유자인지 확인
* 자신의 정보만 수정할 수 있도록 권한 체크
*
* @param id 확인할 ID
* @param email 비교할 이메일
*/
public void validateOwnership(Long id, String email) {
String currentUserEmail = getCurrentUserEmail();
if (!currentUserEmail.equals(email)) {
throw new CustomException(ErrorCode.FORBIDDEN);
}
}
}
@Transactional
public UserDto.UpdateResponse updateUserInfo(Long userId, UserDto.UpdateRequest request) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));
// 전화번호 중복 확인 (본인의 기존 전화번호는 제외)
if (!user.getPhone().equals(request.getPhone()) && userRepository.existsByPhone(request.getPhone())) {
throw new CustomException(ErrorCode.PHONE_ALREADY_EXISTS);
}
user.setName(request.getName());
user.setPhone(request.getPhone());
User updatedUser = userRepository.save(user);
return UserDto.UpdateResponse.builder()
.userId(updatedUser.getId())
.email(updatedUser.getEmail())
.name(updatedUser.getName())
.phone(updatedUser.getPhone())
.role(updatedUser.getRole())
.updatedAt(updatedUser.getUpdatedAt())
.build();
}
@GetMapping("/{partnerId}")
public ResponseEntity<ApiResponse<PartnerDto.PartnerInfoResponse>> getPartnerInfo(
@PathVariable Long partnerId
) {
PartnerDto.PartnerInfoResponse partnerInfo = partnerService.getPartnerInfo(partnerId);
// 본인 정보만 조회 가능하도록 권한 체크
authenticationUtil.validateOwnership(partnerId, partnerInfo.getEmail());
return ResponseEntity.ok(ApiResponse.success("파트너 정보를 성공적으로 조회했습니다.", partnerInfo));
}



