fix #557: guide permission-driven VPD flow
This commit is contained in:
@@ -1,64 +1,93 @@
|
||||
<!doctype html>
|
||||
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
|
||||
<head th:replace="~{fragments/layout :: head('VPD 백오피스')}"></head>
|
||||
<head th:replace="~{fragments/layout :: head('VPD 권한 백오피스')}"></head>
|
||||
<body>
|
||||
<nav th:replace="~{fragments/layout :: nav}"></nav>
|
||||
<main class="container py-4">
|
||||
<div class="page-title">
|
||||
<h1>VPD 권한 백오피스</h1>
|
||||
<p>Oracle Database의 VPD/ORDS 기능을 권한 테이블과 운영 UI로 제어하고 검증합니다.</p>
|
||||
</div>
|
||||
|
||||
<section th:replace="~{fragments/layout :: architectureStrip('')}"></section>
|
||||
<header class="page-title guided-hero">
|
||||
<span class="architecture-kicker">권한을 정하면 DB가 그대로 지킵니다</span>
|
||||
<h1>누가 어떤 데이터를 볼 수 있는지 설계하고, 실제 결과까지 확인하세요.</h1>
|
||||
<p>사용자·그룹·역할에 권한을 연결하면 Oracle VPD가 요청할 때마다 그 규칙을 읽어 허용된 행만 반환합니다. 별도 SQL 필터를 만드는 일은 예외적인 고급 작업입니다.</p>
|
||||
</header>
|
||||
|
||||
<div class="alert alert-warning" th:if="${runtimeErrorMessage}">
|
||||
<div class="fw-semibold" th:text="${runtimeErrorTitle}">데이터 처리 오류가 발생했습니다.</div>
|
||||
<div th:text="${runtimeErrorMessage}"></div>
|
||||
<div class="mt-2" th:if="${showSupportCommand}">
|
||||
<code>./run.sh backoffice-support</code>
|
||||
</div>
|
||||
<div class="mt-2" th:if="${showSupportCommand}"><code>./run.sh backoffice-support</code></div>
|
||||
</div>
|
||||
|
||||
<section class="summary-grid">
|
||||
<a class="summary-tile" href="/permissions">
|
||||
<span class="label">보호 객체</span>
|
||||
<strong th:text="${#lists.size(objects)}">0</strong>
|
||||
<section class="journey-grid" aria-label="권한 적용 네 단계">
|
||||
<a class="journey-card" href="/permissions">
|
||||
<span class="journey-number">1</span>
|
||||
<div>
|
||||
<h2>1. 권한 설계</h2>
|
||||
<p>사용자와 그룹에 역할을 주고, 역할마다 볼 수 있는 객체·행·컬럼을 정합니다.</p>
|
||||
<strong>권한 규칙 만들기 →</strong>
|
||||
</div>
|
||||
</a>
|
||||
<a class="summary-tile" href="/permissions">
|
||||
<span class="label">역할</span>
|
||||
<strong th:text="${#lists.size(roles)}">0</strong>
|
||||
<a class="journey-card" href="/vpd-policies">
|
||||
<span class="journey-number">2</span>
|
||||
<div>
|
||||
<h2>2. DB 보호 연결</h2>
|
||||
<p>보호할 TABLE/VIEW를 고르면 동적 VPD가 1단계의 권한체계를 자동으로 적용합니다.</p>
|
||||
<strong>보호 객체 연결하기 →</strong>
|
||||
</div>
|
||||
</a>
|
||||
<a class="summary-tile" href="/tokens">
|
||||
<span class="label">토큰</span>
|
||||
<strong th:text="${#lists.size(tokens)}">0</strong>
|
||||
<a class="journey-card" href="/tokens">
|
||||
<span class="journey-number">3</span>
|
||||
<div>
|
||||
<h2>3. 토큰 발급</h2>
|
||||
<p>검증할 사용자를 선택해 토큰을 발급하고, 한 번만 보이는 원문을 복사합니다.</p>
|
||||
<strong>테스트 토큰 발급하기 →</strong>
|
||||
</div>
|
||||
</a>
|
||||
<a class="journey-card" href="/probe">
|
||||
<span class="journey-number">4</span>
|
||||
<div>
|
||||
<h2>4. 결과 확인</h2>
|
||||
<p>토큰으로 ORDS를 호출해 사용자·상속 역할과 실제로 보이는 행을 함께 확인합니다.</p>
|
||||
<strong>권한 결과 확인하기 →</strong>
|
||||
</div>
|
||||
</a>
|
||||
</section>
|
||||
|
||||
<section class="content-band macro-micro-grid">
|
||||
<div>
|
||||
<span class="architecture-kicker">MACRO · 전체 관점</span>
|
||||
<h2>권한체계가 유일한 기준입니다.</h2>
|
||||
<p>일상적인 변경은 사용자, 그룹, 역할, 권한 규칙에서만 합니다. 같은 규칙을 화면과 DB 필터에 이중으로 작성하지 않습니다.</p>
|
||||
</div>
|
||||
<div>
|
||||
<span class="architecture-kicker">MICRO · 실행 관점</span>
|
||||
<h2>VPD가 요청마다 조건을 계산합니다.</h2>
|
||||
<p>토큰에서 사용자를 찾고 직접 역할과 그룹 상속 역할을 합친 뒤, 객체의 ALLOW/DENY 및 행·열 규칙을 적용합니다. 근거는 마지막 검증 단계에서 확인합니다.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="summary-grid" aria-label="현재 등록 현황">
|
||||
<a class="summary-tile" href="/permissions"><span class="label">보호 객체</span><strong th:text="${#lists.size(objects)}">0</strong></a>
|
||||
<a class="summary-tile" href="/roles"><span class="label">역할</span><strong th:text="${#lists.size(roles)}">0</strong></a>
|
||||
<a class="summary-tile" href="/tokens"><span class="label">발급 이력</span><strong th:text="${#lists.size(tokens)}">0</strong></a>
|
||||
</section>
|
||||
|
||||
<section class="content-band">
|
||||
<div class="section-heading">
|
||||
<h2>최근 보호 객체</h2>
|
||||
<a class="btn btn-sm rw-btn-secondary" href="/probe">검증 실행</a>
|
||||
<div>
|
||||
<h2>현재 검증 가능한 데이터</h2>
|
||||
<p class="section-subtitle">권한 규칙과 ORDS 경로가 등록된 보호 객체입니다.</p>
|
||||
</div>
|
||||
<a class="btn btn-sm rw-btn-primary" href="/probe">결과 확인</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Owner</th>
|
||||
<th>Object</th>
|
||||
<th>ORDS Path</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<thead><tr><th>데이터 객체</th><th>검증 경로</th><th>상태</th></tr></thead>
|
||||
<tbody>
|
||||
<tr th:each="object : ${objects}">
|
||||
<td th:text="${object.owner()}">ADMIN</td>
|
||||
<td th:text="${object.objectName()}">CB_V_SEARCH_DOCUMENTS</td>
|
||||
<td><code th:text="${object.ordsPath()}">search/documents</code></td>
|
||||
<td><span class="badge text-bg-success">enabled</span></td>
|
||||
</tr>
|
||||
<tr th:if="${#lists.isEmpty(objects)}">
|
||||
<td colspan="4" class="text-muted">등록된 보호 객체가 없습니다.</td>
|
||||
<td><strong th:text="${object.displayName()}">ADMIN.OBJECT</strong></td>
|
||||
<td><code th:text="${object.ordsPath()}">path</code></td>
|
||||
<td><span class="badge text-bg-success">사용 가능</span></td>
|
||||
</tr>
|
||||
<tr th:if="${#lists.isEmpty(objects)}"><td colspan="3" class="text-muted">아직 검증할 보호 객체가 없습니다. 1단계에서 객체 권한을 먼저 등록하세요.</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user