[MODIFY] 외부 Edge 패키지 등록 API 보안 강화, Bearer 인증 추가 및 EdgePkgInfoRequest DTO 필드 수정

main
bjkim 8 months ago
parent 640e3618ae
commit 16759d37ad

@ -1,11 +1,15 @@
package kr.re.etri.autoflow.controllers;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import kr.re.etri.autoflow.payload.request.EdgePkgInfoRequest;
import kr.re.etri.autoflow.service.ExternalAuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -46,20 +50,28 @@ public class ExternalAuthController {
}
}
@Operation(summary = "외부 Edge 패키지 등록", description = "외부 서버로 Edge 패키지 정보를 파일과 함께 전송하여 등록합니다.")
@PostMapping(value = "/add", consumes = {"multipart/form-data"})
@Operation(
summary = "외부 Edge 패키지 등록",
description = "외부 서버로 Edge 패키지 정보를 파일과 함께 전송하여 등록합니다.",
security = @SecurityRequirement(name = "bearerAuth")
)
@PostMapping(value = "/add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> addEdgePackage(
@Parameter(description = "로그인 시 발급받은 Bearer 토큰") @RequestHeader("Authorization") String bearerToken,
@Parameter(description = "Edge 패키지 등록 요청 데이터") @RequestPart("edgePkgInfoVO") EdgePkgInfoRequest edgePkgInfoRequest,
@Parameter(description = "업로드할 패키지 파일") @RequestPart(value = "file", required = false) MultipartFile file
@RequestHeader("Authorization") String bearerToken,
@RequestPart("edgePkgInfoVO") String edgePkgInfoJson,
@RequestPart(value = "file", required = false) MultipartFile file
) {
try {
ObjectMapper mapper = new ObjectMapper();
EdgePkgInfoRequest edgePkgInfoRequest = mapper.readValue(edgePkgInfoJson, EdgePkgInfoRequest.class);
Object response = externalAuthService.uploadEdgePackage(bearerToken, edgePkgInfoRequest, file);
return ResponseEntity.ok(response);
} catch (JsonProcessingException e) {
return ResponseEntity.badRequest().body("잘못된 JSON 형식: " + e.getMessage());
} catch (Exception e) {
return ResponseEntity.internalServerError().body(
String.format("파일 업로드 실패: %s", e.getMessage())
);
return ResponseEntity.internalServerError().body("파일 업로드 실패: " + e.getMessage());
}
}

@ -1,5 +1,6 @@
package kr.re.etri.autoflow.payload.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@ -12,23 +13,39 @@ import java.util.List;
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "Edge 패키지 등록 요청 객체")
public class EdgePkgInfoRequest {
@Schema(description = "Edge 패키지 시리얼 번호", example = "1")
private int ed_pkg_serial;
private int sw_group;
private int sw_type;
private String sw_manufacturer;
private String package_id;
private String package_name;
private String window_root_location;
private String window_exe_name;
private String linux_root_location;
private String linux_exe_name;
private Date create_datetime;
@Schema(description = "설치 위치", example = "/opt/edge/package")
private String download_location;
@Schema(description = "패키지 ID", example = "pkg_001")
private String sw_id;
@Schema(description = "소프트웨어 버전", example = "v1.0.0")
private String sw_version;
@Schema(description = "소프트웨어 이름", example = "Edge Analytics")
private String sw_name;
@Schema(description = "등록 사용자 ID", example = "admin")
private String user_id;
private String sw_group_name;
private String sw_type_name;
private List<EdgePkgInfoRequest> edge_info_list;
@Schema(description = "인증 ID", example = "auth_12345")
private String auth_id;
@Schema(description = "설치 OS", example = "Linux")
private String install_os;
@Schema(description = "등록 일시", example = "2025-10-15T14:30:00")
private Date archive_type;
@Schema(description = "실행 여부 (0/1)", example = "1")
private String exec_yn;
@Schema(description = "등록인만 접근 여부 (0/1)", example = "1")
private String secret_at;
private boolean admin_at = false;
}

@ -35,23 +35,32 @@ public class OpenAPIConfig {
.servers(createServerList());
}
private static final String SECURITY_SCHEME_BEARER = "bearerAuth";
private Components createComponents() {
return new Components()
.addSecuritySchemes(SECURITY_SCHEME_ACCESS,
new SecurityScheme()
.name("cuuva-jwt") // 액세스 토큰 쿠키 이름
.name("cuuva-jwt")
.bearerFormat("JWT")
.type(SecurityScheme.Type.APIKEY)
.in(SecurityScheme.In.HEADER)
)
.addSecuritySchemes(SECURITY_SCHEME_REFRESH,
new SecurityScheme()
.name("cuuva-jwt-refresh") // 리프레시 토큰 쿠키 이름
.name("cuuva-jwt-refresh")
.type(SecurityScheme.Type.APIKEY)
.in(SecurityScheme.In.HEADER)
)
.addSecuritySchemes(SECURITY_SCHEME_BEARER,
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")
);
}
private SecurityRequirement createSecurityRequirement() {
return new SecurityRequirement()
.addList(SECURITY_SCHEME_ACCESS)

Loading…
Cancel
Save