Consolidate data access control backoffice updates

This commit is contained in:
devmrko
2026-07-13 23:06:23 +09:00
parent 403298d474
commit e18b30feab
181 changed files with 11571 additions and 954 deletions

View File

@@ -17,8 +17,8 @@ class GuidedFlowTemplateTest {
String javascript = Files.readString(Path.of("src/main/resources/static/js/app.js"));
assertThat(html)
.contains("th:replace=\"~{fragments/layout :: head('VPD 권한 운영')}\"")
.contains("권한 운영 흐름")
.contains("th:replace=\"~{fragments/layout :: head('데이터 접근 제어')}\"")
.contains("행 접근과 컬럼 마스킹 운영 흐름")
.contains("업무 흐름")
.contains("dashboard-menu-flow")
.contains("도움말: 메뉴와 권한 적용 구조 보기")
@@ -27,7 +27,7 @@ class GuidedFlowTemplateTest {
.contains("CB_AGENT_CTX")
.contains("권한 데이터 모델")
.contains("접근 검증")
.contains("접근 규칙")
.contains("접근 규칙")
.contains("현재 상태")
.contains("등록 대상 상세")
.contains("<details class=\"dashboard-details\">")
@@ -35,8 +35,8 @@ class GuidedFlowTemplateTest {
.doesNotContain("dashboard-workflow")
.doesNotContain(">01<", ">02<");
assertThat(layout)
.contains("VPD 권한 운영")
.contains("권한 관리")
.contains("데이터 접근 제어")
.contains("접근 제어")
.contains("보호·검증")
.contains("연동 도구")
.contains("운영")
@@ -44,16 +44,24 @@ class GuidedFlowTemplateTest {
.contains("조회 연동")
.contains("정형 데이터 조회")
.contains("MCP 서비스")
.contains("컬럼 마스킹")
.contains("컬럼 원문 표시 허용")
.contains("행 접근 필터 구조")
.contains("보안 SQL 스크립트")
.contains("고급 접근 조건")
.contains("시스템 설정")
.contains("DB 준비 상태")
.contains("data-submenu-trigger")
.contains("data-submenu-bar")
.contains("data-submenu-panel")
.contains("backoffice-can-mutate")
.contains("backoffice-read-only")
.doesNotContain("VPD Backoffice");
assertThat(javascript)
.contains("data-submenu-trigger")
.contains("data-submenu-panel")
.contains("disableReadOnlyMutationForms")
.contains("/vector-knowledge/search")
.doesNotContain("closeAllMenuGroups");
}
@@ -64,7 +72,8 @@ class GuidedFlowTemplateTest {
"effective-matrix.html", "users.html", "groups.html", "roles.html", "vector-knowledge.html",
"operation-status.html", "settings.html", "settings-database.html", "ords-handlers.html",
"vpd-filter-policies.html", "mcp-chatbot.html", "mcp-reasoning.html", "mcp-client-demo.html",
"mcp-sse.html", "structured-data.html")) {
"mcp-sse.html", "structured-data.html", "masking-rules.html", "user-masking-rules.html",
"vpd-filter-runtime.html", "security-sql-scripts.html")) {
assertThat(template(page))
.contains("<summary>도움말</summary>")
.doesNotContain("context-summary")
@@ -74,6 +83,33 @@ class GuidedFlowTemplateTest {
.doesNotContain("1 · CONTENT", "2 · ACCESS POLICY", "3 · SEARCH");
}
@Test
void loginOffersRememberMeOnlyThroughTheSpringSecurityParameter() throws IOException {
assertThat(template("login.html"))
.contains("name=\"remember-me\"")
.contains("데이터 접근 제어 콘솔")
.contains("<span class=\"login-mark\">접근</span>")
.contains("로그인 유지")
.contains("th:if=\"${rememberMeAvailable}\"")
.doesNotContain("<span class=\"login-mark\">VPD</span>");
}
@Test
void securitySqlScriptsCanRequestExplanationWithoutExecutingSql() throws IOException {
String page = template("security-sql-scripts.html");
String result = template("fragments/security-sql-script-explanation.html");
assertThat(page)
.contains("hx-post=\"/security-sql-scripts/explanation\"")
.contains("LLM 전체·블록·토큰 처리 설명 생성")
.contains("원문은 실행·수정하지 않고");
assertThat(result)
.contains("LLM 스크립트 설명")
.contains("토큰 처리와 행 접근/ASO 적용 흐름")
.contains("data-markdown-view")
.contains("근거 Prompt 보기");
}
@Test
void productFormsUseTaskNamesInsteadOfVisibleStepNumbers() throws IOException {
String permissions = template("permissions.html");
@@ -148,11 +184,11 @@ class GuidedFlowTemplateTest {
String html = template("objects.html");
assertThat(html)
.contains("누가 어떤 행을 볼 수 있는지는 권한 규칙과 VPD에서 결정")
.contains("누가 어떤 행을 볼 수 있는지는 행 접근 규칙과 Oracle VPD 정책에서 결정")
.contains("지식 검색 연결 흐름")
.contains("VPD context 설정과 기본 SELECT")
.contains("행 접근 context 설정과 기본 SELECT")
.contains("전용 벡터 Handler 사용")
.contains("원문 표시 허용 컬럼")
.contains("컬럼 마스킹")
.doesNotContain("표시 보호 등급", "마스킹 방식");
}
@@ -186,7 +222,7 @@ class GuidedFlowTemplateTest {
assertThat(roles)
.contains("표시 보호 등급 상한")
.contains("행 접근 권한은 권한 규칙과 VPD에서 결정합니다");
.contains("행 접근 권한은 행 접근 규칙과 Oracle VPD 정책에서 결정합니다");
assertThat(tokens)
.contains("회수·만료 포함")
.contains("현재 사용 가능한 토큰만");
@@ -241,7 +277,7 @@ class GuidedFlowTemplateTest {
assertThat(chatbot).contains("검증 세션 사용자").contains("태그 벡터 검색");
assertThat(reasoning).contains("MCP tool을 고르고").contains("검증 세션 사용자").contains("MCP Tool");
assertThat(client).contains("tool 선택과 호출은 reasoning 결과").doesNotContain("Context Path");
assertThat(sse).contains("Instruction / parameter mapping").contains("bearerToken");
assertThat(sse).contains("Instruction / parameter mapping").contains("Authorization");
}
@Test
@@ -274,7 +310,7 @@ class GuidedFlowTemplateTest {
.contains("RLS_INFO")
.contains("참고용 SQL 재현")
.contains("SQL (재현)")
.contains("VPD 조건 (재현)")
.contains("행 접근 조건 (VPD predicate 재현)")
.contains("ALL: 추가 행 필터 없음")
.contains("기본 whitelist 역할");
assertThat(vectorSql)