fix #424: add filter and policy management lists
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<main class="container py-4">
|
||||
<div class="page-title">
|
||||
<h1>VPD 설정</h1>
|
||||
<p>보호 객체에 Oracle VPD policy를 등록하고, policy function/filter predicate를 확인합니다.</p>
|
||||
<p>보호 객체에 적용된 Oracle VPD policy와 policy function/filter predicate를 확인합니다.</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-warning" th:if="${runtimeError}">
|
||||
@@ -18,204 +18,10 @@
|
||||
|
||||
<section class="content-band">
|
||||
<div class="section-heading">
|
||||
<h2>Policy 등록</h2>
|
||||
<h2>적용 현황</h2>
|
||||
<a class="btn btn-sm rw-btn-primary" href="/vpd-filter-policies">Filter Policy 관리</a>
|
||||
</div>
|
||||
<form method="post" action="/vpd-policies" class="form-grid">
|
||||
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
||||
<label>
|
||||
VPD 적용 대상
|
||||
<select class="form-select" name="objectKey" required>
|
||||
<option th:each="object : ${objects}"
|
||||
th:value="${object.owner() + '.' + object.objectName()}"
|
||||
th:text="${object.displayName() + ' / ' + object.ordsPath()}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Policy 이름
|
||||
<select class="form-select" name="policyName" required>
|
||||
<option th:each="policyName : ${formOptions.policyNames()}"
|
||||
th:value="${policyName}"
|
||||
th:text="${policyName}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="span-2">
|
||||
기존 Function 선택
|
||||
<select class="form-select" name="functionKey">
|
||||
<option value="">Filter predicate로 새 function 자동 생성</option>
|
||||
<option th:each="function : ${formOptions.functions()}"
|
||||
th:value="${function.value()}"
|
||||
th:text="${function.label()}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Function Owner
|
||||
<select class="form-select" name="functionOwner">
|
||||
<option value="">현재 연결 사용자</option>
|
||||
<option th:each="owner : ${formOptions.owners()}"
|
||||
th:value="${owner}"
|
||||
th:text="${owner}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Function 이름
|
||||
<select class="form-select" name="functionName">
|
||||
<option value="">POLICY_NAME_FILTER 자동 생성</option>
|
||||
<option th:each="function : ${formOptions.functions()}"
|
||||
th:value="${function.functionName()}"
|
||||
th:text="${function.functionName()}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<div>
|
||||
Statement Types
|
||||
<div class="checkbox-row">
|
||||
<label class="form-check" th:each="statement : ${formOptions.statementTypes()}">
|
||||
<input class="form-check-input"
|
||||
type="checkbox"
|
||||
name="statementTypes"
|
||||
th:value="${statement}"
|
||||
th:checked="${statement == 'SELECT'}">
|
||||
<span class="form-check-label" th:text="${statement}">SELECT</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-check align-self-end">
|
||||
<input class="form-check-input" id="vpd-enabled" type="checkbox" name="enabled" value="true" checked>
|
||||
<label class="form-check-label" for="vpd-enabled">등록 즉시 활성화</label>
|
||||
</div>
|
||||
<div class="form-check span-2">
|
||||
<input class="form-check-input" id="vpd-update-check" type="checkbox" name="updateCheck" value="true">
|
||||
<label class="form-check-label" for="vpd-update-check">INSERT/UPDATE에도 predicate check 적용</label>
|
||||
</div>
|
||||
<label class="span-2">
|
||||
Filter predicate
|
||||
<textarea class="form-control" id="vpd-filter-predicate" name="filterPredicate" rows="4"
|
||||
placeholder="예: dept_code = SYS_CONTEXT(''CB_AGENT_CTX'', ''DEPT_CODE'') 비우면 기존 Function 이름으로 ADD_POLICY만 실행합니다."></textarea>
|
||||
</label>
|
||||
<div class="question-presets span-2" aria-label="Filter predicate 예시">
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-filter-predicate"
|
||||
data-question="1=0">
|
||||
전체 차단
|
||||
</button>
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-filter-predicate"
|
||||
data-question="1=1">
|
||||
전체 허용
|
||||
</button>
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-filter-predicate"
|
||||
data-question="dept_code = SYS_CONTEXT('CB_AGENT_CTX', 'DEPT_CODE')">
|
||||
부서 일치
|
||||
</button>
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-filter-predicate"
|
||||
data-question="owner_emp_no = SYS_CONTEXT('CB_AGENT_CTX', 'EMP_NO')">
|
||||
본인 소유
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn rw-btn-primary" type="submit">Policy 등록</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="content-band">
|
||||
<div class="section-heading">
|
||||
<h2>스키마 벌크 적용</h2>
|
||||
</div>
|
||||
<form method="post" action="/vpd-policies/bulk" class="form-grid">
|
||||
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
||||
<label>
|
||||
Schema
|
||||
<select class="form-select" name="schemaOwner" required>
|
||||
<option th:each="owner : ${formOptions.schemaOwners()}"
|
||||
th:value="${owner}"
|
||||
th:text="${owner}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<div>
|
||||
Object Types
|
||||
<div class="checkbox-row">
|
||||
<label class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="includeTables" value="true" checked>
|
||||
<span class="form-check-label">TABLE</span>
|
||||
</label>
|
||||
<label class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="includeViews" value="true" checked>
|
||||
<span class="form-check-label">VIEW</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<label class="span-2">
|
||||
기존 Function 선택
|
||||
<select class="form-select" name="functionKey">
|
||||
<option value="">Filter predicate로 벌크 function 자동 생성</option>
|
||||
<option th:each="function : ${formOptions.functions()}"
|
||||
th:value="${function.value()}"
|
||||
th:text="${function.label()}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Function Owner
|
||||
<select class="form-select" name="functionOwner">
|
||||
<option value="">현재 연결 사용자</option>
|
||||
<option th:each="owner : ${formOptions.owners()}"
|
||||
th:value="${owner}"
|
||||
th:text="${owner}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Function 이름
|
||||
<select class="form-select" name="functionName">
|
||||
<option value="">SCHEMA_BULK_FILTER 자동 생성</option>
|
||||
<option th:each="function : ${formOptions.functions()}"
|
||||
th:value="${function.functionName()}"
|
||||
th:text="${function.functionName()}"></option>
|
||||
</select>
|
||||
</label>
|
||||
<div>
|
||||
Statement Types
|
||||
<div class="checkbox-row">
|
||||
<label class="form-check" th:each="statement : ${formOptions.statementTypes()}">
|
||||
<input class="form-check-input"
|
||||
type="checkbox"
|
||||
name="statementTypes"
|
||||
th:value="${statement}"
|
||||
th:checked="${statement == 'SELECT'}">
|
||||
<span class="form-check-label" th:text="${statement}">SELECT</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-check align-self-end">
|
||||
<input class="form-check-input" id="vpd-bulk-enabled" type="checkbox" name="enabled" value="true" checked>
|
||||
<label class="form-check-label" for="vpd-bulk-enabled">등록 즉시 활성화</label>
|
||||
</div>
|
||||
<div class="form-check span-2">
|
||||
<input class="form-check-input" id="vpd-bulk-update-check" type="checkbox" name="updateCheck" value="true">
|
||||
<label class="form-check-label" for="vpd-bulk-update-check">INSERT/UPDATE에도 predicate check 적용</label>
|
||||
</div>
|
||||
<label class="span-2">
|
||||
Filter predicate
|
||||
<textarea class="form-control" id="vpd-bulk-filter-predicate" name="filterPredicate" rows="4"
|
||||
placeholder="기존 Function을 선택하지 않으면 이 predicate로 스키마 공통 function을 생성합니다."></textarea>
|
||||
</label>
|
||||
<div class="question-presets span-2" aria-label="Bulk filter predicate 예시">
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-bulk-filter-predicate"
|
||||
data-question="1=0">
|
||||
전체 차단
|
||||
</button>
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-bulk-filter-predicate"
|
||||
data-question="dept_code = SYS_CONTEXT('CB_AGENT_CTX', 'DEPT_CODE')">
|
||||
부서 일치
|
||||
</button>
|
||||
<button class="btn rw-btn-secondary question-preset" type="button"
|
||||
data-target="vpd-bulk-filter-predicate"
|
||||
data-question="owner_emp_no = SYS_CONTEXT('CB_AGENT_CTX', 'EMP_NO')">
|
||||
본인 소유
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn rw-btn-primary" type="submit">스키마 전체 적용</button>
|
||||
</form>
|
||||
<p class="text-muted mb-0">이 화면은 현재 DB에 적용된 VPD policy와 policy function/filter 상세를 조회합니다. 등록과 벌크 적용은 Filter Policy 관리에서 수행합니다.</p>
|
||||
</section>
|
||||
|
||||
<section class="content-band">
|
||||
@@ -310,17 +116,5 @@
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script>
|
||||
document.querySelectorAll('.question-preset').forEach((button) => {
|
||||
button.addEventListener('click', () => {
|
||||
const target = document.getElementById(button.dataset.target || '');
|
||||
if (!target) {
|
||||
return;
|
||||
}
|
||||
target.value = button.dataset.question || '';
|
||||
target.focus();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user