fix #477: show target policy filters
This commit is contained in:
@@ -63,7 +63,13 @@
|
||||
CASE WHEN po.object_id IS NULL THEN 'N' ELSE po.enabled_yn END AS protected_yn,
|
||||
po.ords_path,
|
||||
COUNT(p.policy_name) AS policy_count,
|
||||
LISTAGG(p.policy_name, ', ') WITHIN GROUP (ORDER BY p.policy_name) AS policy_names
|
||||
LISTAGG(p.policy_name, ', ') WITHIN GROUP (ORDER BY p.policy_name) AS policy_names,
|
||||
LISTAGG(
|
||||
p.pf_owner ||
|
||||
CASE WHEN p.package IS NULL THEN '.' ELSE '.' || p.package || '.' END ||
|
||||
p.function,
|
||||
', '
|
||||
) WITHIN GROUP (ORDER BY p.policy_name) AS filter_names
|
||||
FROM managed_objects o
|
||||
LEFT JOIN cb_protected_object po
|
||||
ON po.owner = o.owner
|
||||
@@ -210,6 +216,14 @@
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="findPoliciesForObject" resultType="com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView">
|
||||
SELECT <include refid="policyColumns"><property name="alias" value="p."/></include>
|
||||
FROM all_policies p
|
||||
WHERE p.object_owner = UPPER(#{objectOwner,jdbcType=VARCHAR})
|
||||
AND p.object_name = UPPER(#{objectName,jdbcType=VARCHAR})
|
||||
ORDER BY p.policy_name
|
||||
</select>
|
||||
|
||||
<select id="findAnyPolicy" resultType="com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView">
|
||||
SELECT <include refid="policyColumns"><property name="alias" value="p."/></include>
|
||||
FROM all_policies p
|
||||
|
||||
@@ -870,6 +870,12 @@ body {
|
||||
padding: .75rem;
|
||||
}
|
||||
|
||||
.filter-detail-stack + .filter-detail-stack {
|
||||
border-top: 1px solid var(--rw-border);
|
||||
margin-top: 1rem;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.policy-detail-list {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(120px, 34%) 1fr;
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<!doctype html>
|
||||
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
|
||||
<body>
|
||||
<div th:fragment="detail">
|
||||
<div class="alert alert-warning mb-0" th:if="${errorMessage}" th:text="${errorMessage}"></div>
|
||||
<section class="probe-exchange" th:if="${detail}">
|
||||
<h3>
|
||||
<span th:text="${detail.objectDisplayName()}">ADMIN.TABLE</span>
|
||||
<span class="text-muted"> / Policy Filter</span>
|
||||
</h3>
|
||||
<div th:if="${#lists.isEmpty(detail.rows())}" class="text-muted">
|
||||
이 TABLE/VIEW에 적용된 VPD policy/filter가 없습니다.
|
||||
</div>
|
||||
<div class="filter-detail-stack" th:each="row : ${detail.rows()}">
|
||||
<dl class="policy-detail-list">
|
||||
<dt>Policy</dt>
|
||||
<dd><code th:text="${row.policy().policyName()}">POLICY</code></dd>
|
||||
<dt>Filter</dt>
|
||||
<dd><code th:text="${row.policy().functionDisplayName()}">ADMIN.FILTER</code></dd>
|
||||
<dt>Statements</dt>
|
||||
<dd th:text="${row.policy().statementTypes()} ?: '-'">SELECT</dd>
|
||||
<dt>Status</dt>
|
||||
<dd th:text="${row.policy().enabled()}">YES</dd>
|
||||
</dl>
|
||||
<pre th:if="${row.source().found()}" th:text="${row.source().source()}"></pre>
|
||||
<pre th:unless="${row.source().found()}">ALL_SOURCE에서 조회 가능한 filter source가 없습니다.</pre>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -54,12 +54,14 @@
|
||||
<th>Type</th>
|
||||
<th>VPD 상태</th>
|
||||
<th>Policy</th>
|
||||
<th>Filter</th>
|
||||
<th>백오피스 권한 테이블</th>
|
||||
<th>ORDS Path</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="target : ${vpdTargets}">
|
||||
<th:block th:each="target, iter : ${vpdTargets}">
|
||||
<tr>
|
||||
<td><code th:text="${target.objectDisplayName()}">ADMIN.TABLE</code></td>
|
||||
<td th:text="${target.objectType()}">TABLE</td>
|
||||
<td>
|
||||
@@ -71,6 +73,17 @@
|
||||
<span th:if="${target.vpdApplied()}" th:text="${target.policyNames()}">POLICY</span>
|
||||
<span th:unless="${target.vpdApplied()}" class="text-muted">-</span>
|
||||
</td>
|
||||
<td>
|
||||
<button th:if="${target.vpdApplied()}"
|
||||
class="btn btn-sm btn-outline-secondary policy-function-button"
|
||||
type="button"
|
||||
th:hx-get="@{/vpd-policies/object-filter-detail(objectOwner=${target.owner()},objectName=${target.objectName()})}"
|
||||
th:hx-target="${'#target-filter-detail-' + iter.index}"
|
||||
hx-swap="innerHTML">
|
||||
<code th:text="${target.filterNames()}">ADMIN.FILTER</code>
|
||||
</button>
|
||||
<span th:unless="${target.vpdApplied()}" class="text-muted">-</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge"
|
||||
th:classappend="${target.protectedObject()} ? ' text-bg-primary' : ' text-bg-light'"
|
||||
@@ -81,8 +94,16 @@
|
||||
<span th:unless="${target.ordsPath()}" class="text-muted">ORDS 서빙 미등록</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr th:if="${target.vpdApplied()}">
|
||||
<td colspan="7" class="policy-source-cell">
|
||||
<div th:id="${'target-filter-detail-' + iter.index}" class="text-muted small">
|
||||
Filter 이름을 클릭하면 policy/filter source가 표시됩니다.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</th:block>
|
||||
<tr th:if="${#lists.isEmpty(vpdTargets)}">
|
||||
<td colspan="6" class="text-muted">
|
||||
<td colspan="7" class="text-muted">
|
||||
<span th:if="${selectedSchemaOwner != null && selectedSchemaOwner != ''}"
|
||||
th:text="${selectedSchemaOwner + ' 스키마에서 현재 DB 연결 사용자로 조회 가능한 TABLE/VIEW가 없습니다. 스키마명, ALL_OBJECTS 조회 권한, 객체 권한을 확인하세요.'}">
|
||||
선택한 스키마에서 조회 가능한 TABLE/VIEW가 없습니다.
|
||||
|
||||
Reference in New Issue
Block a user