diff --git a/backend/src/main/java/com/ai/lawyer/global/util/AuthUtil.java b/backend/src/main/java/com/ai/lawyer/global/util/AuthUtil.java index aa8a7a6..6495bf3 100644 --- a/backend/src/main/java/com/ai/lawyer/global/util/AuthUtil.java +++ b/backend/src/main/java/com/ai/lawyer/global/util/AuthUtil.java @@ -1,43 +1,56 @@ package com.ai.lawyer.global.util; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; import org.springframework.web.server.ResponseStatusException; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; import com.ai.lawyer.domain.member.repositories.MemberRepository; +import com.ai.lawyer.domain.member.repositories.OAuth2MemberRepository; import com.ai.lawyer.domain.member.entity.Member; @Component public class AuthUtil { private static MemberRepository memberRepository; + private static OAuth2MemberRepository oauth2MemberRepository; @Autowired public AuthUtil(MemberRepository memberRepository) { AuthUtil.memberRepository = memberRepository; } + @Autowired(required = false) + public void setOauth2MemberRepository(OAuth2MemberRepository oauth2MemberRepository) { + AuthUtil.oauth2MemberRepository = oauth2MemberRepository; + } + public static Long getCurrentMemberId() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { Object principal = authentication.getPrincipal(); System.out.println("[AuthUtil] principal class: " + principal.getClass().getName() + ", value: " + principal); - if (principal instanceof org.springframework.security.core.userdetails.User user) { - try { - return Long.parseLong(user.getUsername()); - } catch (NumberFormatException e) { - return null; + switch (principal) { + case org.springframework.security.core.userdetails.User user -> { + try { + return Long.parseLong(user.getUsername()); + } catch (NumberFormatException e) { + return null; + } + } + case String str -> { + try { + return Long.parseLong(str); + } catch (NumberFormatException e) { + return null; + } } - } else if (principal instanceof String str) { - try { - return Long.parseLong(str); - } catch (NumberFormatException e) { - return null; + case Long l -> { + return l; + } + default -> { } - } else if (principal instanceof Long l) { - return l; } } return null; @@ -50,13 +63,45 @@ public static String getCurrentMemberRole() { } return authentication.getAuthorities().stream() .findFirst() - .map(auth -> auth.getAuthority()) + .map(GrantedAuthority::getAuthority) .orElse(null); } + /** + * memberId로 회원을 조회합니다. (Member 또는 OAuth2Member) + * OAuth2Member인 경우 Member 객체로 변환하여 반환합니다. + * @param memberId 회원 ID + * @return Member 객체 + * @throws ResponseStatusException 회원을 찾을 수 없는 경우 + */ public static Member getMemberOrThrow(Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "회원 정보를 찾을 수 없습니다")); + // 먼저 Member 테이블에서 조회 + java.util.Optional member = memberRepository.findById(memberId); + if (member.isPresent()) { + return member.get(); + } + + // Member 테이블에 없으면 OAuth2Member 테이블에서 조회 + if (oauth2MemberRepository != null) { + java.util.Optional oauth2Member = + oauth2MemberRepository.findById(memberId); + if (oauth2Member.isPresent()) { + // OAuth2Member를 Member로 변환 (엔티티 호환성을 위해) + com.ai.lawyer.domain.member.entity.OAuth2Member oauth = oauth2Member.get(); + return Member.builder() + .memberId(oauth.getMemberId()) + .loginId(oauth.getLoginId()) + .name(oauth.getName()) + .age(oauth.getAge()) + .gender(oauth.getGender()) + .role(oauth.getRole()) + .password("") // OAuth2는 비밀번호 없음 + .build(); + } + } + + // 둘 다 없으면 예외 발생 + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "회원 정보를 찾을 수 없습니다"); } public static Long getAuthenticatedMemberId() {