2026-05-09 21:29:18 +09:00
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
/**
|
2026-06-12 23:40:28 +09:00
|
|
|
* 로그인한 사용자를 나타내는 인증 주체(principal). 스프링 시큐리티의 SecurityContext에 저장되어,
|
|
|
|
|
* 어디서든 "현재 누가 요청 중인지"를 꺼낼 수 있게 한다(예: {@code SecurityUtil.getCurrentUserId()}).
|
|
|
|
|
*
|
|
|
|
|
* <p>UserDetails 구현: 스프링 시큐리티가 인증 주체로 인식하려면 이 인터페이스를 구현해야 한다.
|
|
|
|
|
* 이 시스템은 토큰(JWT) 기반이라 비밀번호 비교 등은 쓰지 않으므로, 계정 상태 메서드들은 모두 true를 반환한다.
|
2026-05-09 21:29:18 +09:00
|
|
|
*/
|
|
|
|
|
@Getter
|
|
|
|
|
@Builder
|
|
|
|
|
public class LoginUser implements UserDetails {
|
|
|
|
|
|
2026-06-12 23:40:28 +09:00
|
|
|
private final Long userId; // 내부 사용자 PK
|
|
|
|
|
private final String loginId; // 로그인 아이디
|
|
|
|
|
private final String userName; // 사용자 이름(표시용)
|
|
|
|
|
private final Long agentId; // 소속 설계사/대리점 ID(정산 권한 범위 판단 등에 사용)
|
|
|
|
|
private final List<String> roleCodes; // 역할 코드 목록(예: ADMIN, MANAGER)
|
2026-05-09 21:29:18 +09:00
|
|
|
|
2026-06-12 23:40:28 +09:00
|
|
|
/** 역할 코드를 스프링 시큐리티 권한(GrantedAuthority)으로 변환. 관례상 "ROLE_" 접두어를 붙인다. */
|
2026-05-09 21:29:18 +09:00
|
|
|
@Override public Collection<? extends GrantedAuthority> getAuthorities() {
|
|
|
|
|
return roleCodes == null ? List.of() :
|
|
|
|
|
roleCodes.stream().<GrantedAuthority>map(r -> new SimpleGrantedAuthority("ROLE_" + r)).toList();
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-12 23:40:28 +09:00
|
|
|
// 비밀번호는 토큰 인증에서 쓰지 않으므로 null. username 은 로그인 아이디를 반환.
|
2026-05-09 21:29:18 +09:00
|
|
|
@Override public String getPassword() { return null; }
|
|
|
|
|
@Override public String getUsername() { return loginId; }
|
2026-06-12 23:40:28 +09:00
|
|
|
// 아래 4개 계정 상태 플래그: 잠금/만료 검사는 로그인 단계에서 별도로 처리하므로 여기선 모두 정상(true).
|
2026-05-09 21:29:18 +09:00
|
|
|
@Override public boolean isAccountNonExpired() { return true; }
|
|
|
|
|
@Override public boolean isAccountNonLocked() { return true; }
|
|
|
|
|
@Override public boolean isCredentialsNonExpired() { return true; }
|
|
|
|
|
@Override public boolean isEnabled() { return true; }
|
|
|
|
|
}
|