인증 관련 PTL_PROPERTY 및 로그인 차단 로직 추가:
eapim-portal CI / build (push) Has been cancelled
eapim-portal Test / test (push) Has been cancelled

- 개발/테스트 환경 인증번호 노출 설정 AuthNoticeProperties 추가
- 삭제된 법인 소속 사용자 로그인 차단 처리 로직 반영
This commit is contained in:
Rinjae
2026-07-28 15:31:21 +09:00
parent b29882c0b2
commit a2f6151a08
2 changed files with 49 additions and 0 deletions
@@ -0,0 +1,43 @@
package com.eactive.apim.portal.apps.auth;
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.stereotype.Component;
/**
* 인증(이메일/SMS) 테스트 안내 관련 PTL_PROPERTY 접근 래퍼.
*
* <p>그룹 {@code Portal}, 키 {@code auth.test-notice.enabled}(true/false). 값이 참이면 인증 요청
* 응답에 인증번호를 실어 화면에 노출한다(실제 발송 대신 테스트 확인 용도). 기존 application.yml
* {@code portal.test-auth-notice-enabled} 설정을 DB PTL_PROPERTY 로 이전한 것으로,
* {@link TwoFactorProperties} 와 동일한 {@code getOrCreateProperty} 패턴을 따른다.</p>
*
* <p><b>prod 프로파일에서는 DB 값과 무관하게 항상 false</b> 를 반환한다(운영 환경 인증번호 노출 금지).
* 세션 keepalive 등 다른 비운영 전용 스위치와 동일한 정책이다.</p>
*/
@Component
@RequiredArgsConstructor
public class AuthNoticeProperties {
public static final String GROUP = "Portal";
public static final String KEY_TEST_NOTICE_ENABLED = "auth.test-notice.enabled";
private final PortalPropertyService portalPropertyService;
private final Environment environment;
/**
* 인증 요청 응답에 인증번호를 실어 UI 에 노출할지 여부(개발/테스트 전용).
* prod 환경에서는 property 값과 무관하게 항상 false.
*/
public boolean isTestNoticeEnabled() {
if (environment.acceptsProfiles(Profiles.of("prod"))) {
return false;
}
String value = portalPropertyService.getOrCreateProperty(
GROUP, KEY_TEST_NOTICE_ENABLED, "true",
"인증(이메일/SMS) 요청 시 인증번호를 화면에 표시할지 여부 (true/false, 테스트 전용)");
return value != null && "true".equalsIgnoreCase(value.trim());
}
}
@@ -79,6 +79,12 @@ public class PortalAuthenticationManager implements AuthenticationManager {
}
if (user.getPortalOrg() != null) {
// 삭제(탈퇴)된 법인 소속 사용자는 2FA 이전에 로그인 차단
if (PortalOrgEnums.OrgStatus.REMOVED.equals(user.getPortalOrg().getOrgStatus())) {
log.debug("삭제된 법인 소속 로그인 차단 - user : {} / org.orgStatus : {}", user.getUsername(), user.getPortalOrg().getOrgStatus());
throw new DisabledException("삭제된 법인의 계정입니다. 로그인할 수 없습니다.");
}
if (!user.getPortalOrg().getApprovalStatus().equals(PortalOrgEnums.ApprovalStatus.COMPLETED)) {
log.debug("기업사용자 - getApprovalStatus : {} / - org.approvalStatus : {}", user.getApprovalStatus(), user.getPortalOrg().getApprovalStatus());
throw new DisabledException("로그인할 수 없습니다. 관리자에게 문의하세요. (법인 승인대기중)");