Consolidate data access control backoffice updates
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user