17ab1098ec
PayInstallmentStep(Step 4.5): 1200%룰로 이연된 분급(installment_plan SCHEDULED)을 도래월(settle_month=정산월)에 recruit_ledger로 편입해 실제 지급. 이전엔 이연만 되고 도래월 지급 절차가 없어 차액이 영구 미지급되던 갭을 메움. - BatchConfig job flow에 step4b(calcRecruit→payInstallment→calcMaintain) 등록 - InstallmentPlanMapper.resetPaidToScheduledByMonth(+XML)로 재실행 멱등 (진입 시 PAID→SCHEDULED 역산, Step4 deleteBySettleMonth가 원장 정리) - RecruitLedgerMapper insert에 reconcile_status 컬럼, SettlementContext.installmentPaidCount - 단위테스트 3건(정상지급/멱등/계약미존재) GREEN 신입교육 주석: 컨트롤러/서비스/공통/프론트 전반에 도메인·코드 설명 주석 추가 (동작 변경 없음 — 빌드/테스트/타입체크 전부 GREEN으로 무회귀 확인). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
44 lines
2.3 KiB
Java
44 lines
2.3 KiB
Java
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()}).
|
|
*
|
|
* <p>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<String> roleCodes; // 역할 코드 목록(예: ADMIN, MANAGER)
|
|
|
|
/** 역할 코드를 스프링 시큐리티 권한(GrantedAuthority)으로 변환. 관례상 "ROLE_" 접두어를 붙인다. */
|
|
@Override public Collection<? extends GrantedAuthority> getAuthorities() {
|
|
return roleCodes == null ? List.of() :
|
|
roleCodes.stream().<GrantedAuthority>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; }
|
|
}
|