package com.ga.common.auth; import lombok.Builder; import lombok.Getter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; import java.util.List; /** * 로그인한 사용자를 나타내는 인증 주체(principal). 스프링 시큐리티의 SecurityContext에 저장되어, * 어디서든 "현재 누가 요청 중인지"를 꺼낼 수 있게 한다(예: {@code SecurityUtil.getCurrentUserId()}). * *

UserDetails 구현: 스프링 시큐리티가 인증 주체로 인식하려면 이 인터페이스를 구현해야 한다. * 이 시스템은 토큰(JWT) 기반이라 비밀번호 비교 등은 쓰지 않으므로, 계정 상태 메서드들은 모두 true를 반환한다. */ @Getter @Builder public class LoginUser implements UserDetails { private final Long userId; // 내부 사용자 PK private final String loginId; // 로그인 아이디 private final String userName; // 사용자 이름(표시용) private final Long agentId; // 소속 설계사/대리점 ID(정산 권한 범위 판단 등에 사용) private final List roleCodes; // 역할 코드 목록(예: ADMIN, MANAGER) /** 역할 코드를 스프링 시큐리티 권한(GrantedAuthority)으로 변환. 관례상 "ROLE_" 접두어를 붙인다. */ @Override public Collection getAuthorities() { return roleCodes == null ? List.of() : roleCodes.stream().map(r -> new SimpleGrantedAuthority("ROLE_" + r)).toList(); } // 비밀번호는 토큰 인증에서 쓰지 않으므로 null. username 은 로그인 아이디를 반환. @Override public String getPassword() { return null; } @Override public String getUsername() { return loginId; } // 아래 4개 계정 상태 플래그: 잠금/만료 검사는 로그인 단계에서 별도로 처리하므로 여기선 모두 정상(true). @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }