- Spring Security Basic Auth 인증 도입 (Bypass 데이터 API만) - 계정 신청/승인/거절 백엔드 API 및 프론트엔드 구현 - 계정 관리 (CRUD, 비밀번호 재설정, 상태/기간 수정) - 401 응답에 계정 상태 상세 메시지 포함 - Swagger UI Basic Auth 스킴/환경별 그룹 노출 연동 - 신청 폼 정규식 검증 및 접근기간 프리셋 선택
130 lines
2.9 KiB
Java
130 lines
2.9 KiB
Java
package com.snp.batch.global.model;
|
|
|
|
import jakarta.persistence.*;
|
|
import lombok.*;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
/**
|
|
* Bypass API 접근 신청 정보를 저장하는 엔티티
|
|
* 외부 사용자가 Bypass API 접근을 신청하고 관리자가 승인/반려하는 워크플로우 관리
|
|
*
|
|
* JPA를 사용하므로 @PrePersist, @PreUpdate로 감사 필드 자동 설정
|
|
*/
|
|
@Entity
|
|
@Table(name = "bypass_api_request",
|
|
indexes = {
|
|
@Index(name = "idx_bypass_request_status", columnList = "status")
|
|
}
|
|
)
|
|
@Getter
|
|
@Setter
|
|
@Builder
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
public class BypassApiRequest {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
/**
|
|
* 신청자 이름
|
|
*/
|
|
@Column(name = "applicant_name", nullable = false, length = 100)
|
|
private String applicantName;
|
|
|
|
/**
|
|
* 소속 기관
|
|
*/
|
|
@Column(name = "organization", length = 200)
|
|
private String organization;
|
|
|
|
/**
|
|
* 신청 목적
|
|
*/
|
|
@Column(name = "purpose", columnDefinition = "TEXT")
|
|
private String purpose;
|
|
|
|
/**
|
|
* 이메일
|
|
*/
|
|
@Column(name = "email", length = 200)
|
|
private String email;
|
|
|
|
/**
|
|
* 연락처
|
|
*/
|
|
@Column(name = "phone", length = 50)
|
|
private String phone;
|
|
|
|
/**
|
|
* 요청 접근 기간
|
|
*/
|
|
@Column(name = "requested_access_period", length = 100)
|
|
private String requestedAccessPeriod;
|
|
|
|
/**
|
|
* 신청 상태 (PENDING, APPROVED, REJECTED)
|
|
*/
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(name = "status", nullable = false, length = 20)
|
|
@Builder.Default
|
|
private RequestStatus status = RequestStatus.PENDING;
|
|
|
|
/**
|
|
* 검토자
|
|
*/
|
|
@Column(name = "reviewed_by", length = 100)
|
|
private String reviewedBy;
|
|
|
|
/**
|
|
* 검토 일시
|
|
*/
|
|
@Column(name = "reviewed_at")
|
|
private LocalDateTime reviewedAt;
|
|
|
|
/**
|
|
* 반려 사유
|
|
*/
|
|
@Column(name = "reject_reason", columnDefinition = "TEXT")
|
|
private String rejectReason;
|
|
|
|
/**
|
|
* 승인 후 생성된 계정
|
|
*/
|
|
@ManyToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "account_id")
|
|
private BypassApiAccount account;
|
|
|
|
/**
|
|
* 생성 일시 (감사 필드)
|
|
*/
|
|
@Column(name = "created_at", nullable = false, updatable = false)
|
|
private LocalDateTime createdAt;
|
|
|
|
/**
|
|
* 수정 일시 (감사 필드)
|
|
*/
|
|
@Column(name = "updated_at", nullable = false)
|
|
private LocalDateTime updatedAt;
|
|
|
|
/**
|
|
* 엔티티 저장 전 자동 호출 (INSERT 시)
|
|
*/
|
|
@PrePersist
|
|
protected void onCreate() {
|
|
LocalDateTime now = LocalDateTime.now();
|
|
this.createdAt = now;
|
|
this.updatedAt = now;
|
|
}
|
|
|
|
/**
|
|
* 엔티티 업데이트 전 자동 호출 (UPDATE 시)
|
|
*/
|
|
@PreUpdate
|
|
protected void onUpdate() {
|
|
this.updatedAt = LocalDateTime.now();
|
|
}
|
|
}
|