release: 2026-04-08 (8건 커밋) #10
@ -4,6 +4,16 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2026-04-08]
|
||||||
|
|
||||||
|
### 변경
|
||||||
|
- Basic Auth 인증 비활성화 (프록시 서버로 인증 이관)
|
||||||
|
- Swagger Basic Auth 보안 스키마 제거
|
||||||
|
- 프론트엔드 API 계정 신청/관리 메뉴 숨김
|
||||||
|
|
||||||
|
### 수정
|
||||||
|
- actuator 경로 로그필터가 context-path 환경에서 동작하지 않는 버그 수정 (#6)
|
||||||
|
|
||||||
## [2026-04-07]
|
## [2026-04-07]
|
||||||
|
|
||||||
### 수정
|
### 수정
|
||||||
|
|||||||
@ -11,9 +11,6 @@ const BypassConfig = lazy(() => import('./pages/BypassConfig'));
|
|||||||
const BypassCatalog = lazy(() => import('./pages/BypassCatalog'));
|
const BypassCatalog = lazy(() => import('./pages/BypassCatalog'));
|
||||||
const ScreeningGuide = lazy(() => import('./pages/ScreeningGuide'));
|
const ScreeningGuide = lazy(() => import('./pages/ScreeningGuide'));
|
||||||
const RiskComplianceHistory = lazy(() => import('./pages/RiskComplianceHistory'));
|
const RiskComplianceHistory = lazy(() => import('./pages/RiskComplianceHistory'));
|
||||||
const BypassAccountRequests = lazy(() => import('./pages/BypassAccountRequests'));
|
|
||||||
const BypassAccountManagement = lazy(() => import('./pages/BypassAccountManagement'));
|
|
||||||
const BypassAccessRequest = lazy(() => import('./pages/BypassAccessRequest'));
|
|
||||||
|
|
||||||
function AppLayout() {
|
function AppLayout() {
|
||||||
const { toasts, removeToast } = useToastContext();
|
const { toasts, removeToast } = useToastContext();
|
||||||
@ -41,9 +38,6 @@ function AppLayout() {
|
|||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/bypass-catalog" element={<BypassCatalog />} />
|
<Route path="/bypass-catalog" element={<BypassCatalog />} />
|
||||||
<Route path="/bypass-config" element={<BypassConfig />} />
|
<Route path="/bypass-config" element={<BypassConfig />} />
|
||||||
<Route path="/bypass-account-requests" element={<BypassAccountRequests />} />
|
|
||||||
<Route path="/bypass-account-management" element={<BypassAccountManagement />} />
|
|
||||||
<Route path="/bypass-access-request" element={<BypassAccessRequest />} />
|
|
||||||
<Route path="/screening-guide" element={<ScreeningGuide />} />
|
<Route path="/screening-guide" element={<ScreeningGuide />} />
|
||||||
<Route path="/risk-compliance-history" element={<RiskComplianceHistory />} />
|
<Route path="/risk-compliance-history" element={<RiskComplianceHistory />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
|
|||||||
@ -30,9 +30,6 @@ const MENU_STRUCTURE: MenuSection[] = [
|
|||||||
children: [
|
children: [
|
||||||
{ id: 'bypass-catalog', label: 'API 카탈로그', path: '/bypass-catalog' },
|
{ id: 'bypass-catalog', label: 'API 카탈로그', path: '/bypass-catalog' },
|
||||||
{ id: 'bypass-config', label: 'API 관리', path: '/bypass-config' },
|
{ id: 'bypass-config', label: 'API 관리', path: '/bypass-config' },
|
||||||
{ id: 'bypass-account-requests', label: '계정 신청 관리', path: '/bypass-account-requests' },
|
|
||||||
{ id: 'bypass-account-management', label: '계정 관리', path: '/bypass-account-management' },
|
|
||||||
{ id: 'bypass-access-request', label: 'API 계정 신청', path: '/bypass-access-request' },
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -5,11 +5,11 @@ const sections = [
|
|||||||
{
|
{
|
||||||
title: 'S&P Global API',
|
title: 'S&P Global API',
|
||||||
description: 'S&P Global Maritime API',
|
description: 'S&P Global Maritime API',
|
||||||
detail: 'API 카탈로그, API 계정 신청',
|
detail: 'API 카탈로그, API 설정 관리',
|
||||||
path: '/bypass-catalog',
|
path: '/bypass-catalog',
|
||||||
icon: '🌐',
|
icon: '🌐',
|
||||||
iconClass: 'gc-card-icon gc-card-icon-guide',
|
iconClass: 'gc-card-icon gc-card-icon-guide',
|
||||||
menuCount: 5,
|
menuCount: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'S&P Risk & Compliance',
|
title: 'S&P Risk & Compliance',
|
||||||
|
|||||||
@ -58,7 +58,7 @@ public class ApiAccessLoggingFilter extends OncePerRequestFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldSkip(String uri) {
|
private boolean shouldSkip(String uri) {
|
||||||
return uri.startsWith("/actuator")
|
return uri.contains("/actuator")
|
||||||
|| uri.startsWith("/css")
|
|| uri.startsWith("/css")
|
||||||
|| uri.startsWith("/js")
|
|| uri.startsWith("/js")
|
||||||
|| uri.startsWith("/images")
|
|| uri.startsWith("/images")
|
||||||
|
|||||||
@ -33,12 +33,8 @@ public class SecurityConfig {
|
|||||||
.sessionManagement(session ->
|
.sessionManagement(session ->
|
||||||
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||||
.authorizeHttpRequests(auth -> auth
|
.authorizeHttpRequests(auth -> auth
|
||||||
.requestMatchers("/api/compliance/**").authenticated()
|
|
||||||
.requestMatchers("/api/risk/**").authenticated()
|
|
||||||
.anyRequest().permitAll()
|
.anyRequest().permitAll()
|
||||||
)
|
);
|
||||||
.httpBasic(basic -> basic
|
|
||||||
.authenticationEntryPoint(new BypassAuthenticationEntryPoint()));
|
|
||||||
|
|
||||||
return http.build();
|
return http.build();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
package com.snp.batch.global.config;
|
package com.snp.batch.global.config;
|
||||||
|
|
||||||
import io.swagger.v3.oas.models.Components;
|
|
||||||
import io.swagger.v3.oas.models.OpenAPI;
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
import io.swagger.v3.oas.models.info.Contact;
|
import io.swagger.v3.oas.models.info.Contact;
|
||||||
import io.swagger.v3.oas.models.info.Info;
|
import io.swagger.v3.oas.models.info.Info;
|
||||||
import io.swagger.v3.oas.models.info.License;
|
import io.swagger.v3.oas.models.info.License;
|
||||||
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
|
||||||
import io.swagger.v3.oas.models.security.SecurityScheme;
|
|
||||||
import io.swagger.v3.oas.models.servers.Server;
|
import io.swagger.v3.oas.models.servers.Server;
|
||||||
import org.springdoc.core.models.GroupedOpenApi;
|
import org.springdoc.core.models.GroupedOpenApi;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@ -77,7 +74,6 @@ public class SwaggerConfig {
|
|||||||
.title("Bypass API")
|
.title("Bypass API")
|
||||||
.description("S&P Global 선박/해운 데이터를 제공합니다.")
|
.description("S&P Global 선박/해운 데이터를 제공합니다.")
|
||||||
.version("v1.0.0"));
|
.version("v1.0.0"));
|
||||||
openApi.addSecurityItem(new SecurityRequirement().addList("basicAuth"));
|
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@ -115,13 +111,7 @@ public class SwaggerConfig {
|
|||||||
|
|
||||||
return new OpenAPI()
|
return new OpenAPI()
|
||||||
.info(defaultApiInfo())
|
.info(defaultApiInfo())
|
||||||
.servers(servers)
|
.servers(servers);
|
||||||
.components(new Components()
|
|
||||||
.addSecuritySchemes("basicAuth",
|
|
||||||
new SecurityScheme()
|
|
||||||
.type(SecurityScheme.Type.HTTP)
|
|
||||||
.scheme("basic")
|
|
||||||
.description("Bypass API 접근 계정 (발급된 ID/PW 사용)")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Info defaultApiInfo() {
|
private Info defaultApiInfo() {
|
||||||
|
|||||||
불러오는 중...
Reference in New Issue
Block a user