Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 61 additions & 16 deletions backend/src/main/java/com/ai/lawyer/global/util/AuthUtil.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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> member = memberRepository.findById(memberId);
if (member.isPresent()) {
return member.get();
}

// Member 테이블에 없으면 OAuth2Member 테이블에서 조회
if (oauth2MemberRepository != null) {
java.util.Optional<com.ai.lawyer.domain.member.entity.OAuth2Member> 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() {
Expand Down