From effd29c534c4cc52dded8ef5d7454481e6ff163d Mon Sep 17 00:00:00 2001 From: devmrko Date: Thu, 25 Jun 2026 17:31:09 +0900 Subject: [PATCH] fix #424: add filter policy management tab --- .../web/VpdPolicyController.java | 86 ++++++++- .../resources/templates/fragments/layout.html | 1 + .../templates/vpd-filter-policies.html | 163 ++++++++++++++++++ 3 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/templates/vpd-filter-policies.html diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java index 0e17aa6..a776d6e 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java @@ -26,6 +26,17 @@ public class VpdPolicyController { @GetMapping("/vpd-policies") public String policies(Model model) { + populatePolicyModel(model); + return "vpd-policies"; + } + + @GetMapping("/vpd-filter-policies") + public String filterPolicies(Model model) { + populatePolicyModel(model); + return "vpd-filter-policies"; + } + + private void populatePolicyModel(Model model) { try { model.addAttribute("policies", vpdPolicyService.findPolicies()); model.addAttribute("objects", protectedObjectService.findEnabled()); @@ -37,7 +48,6 @@ public class VpdPolicyController { model.addAttribute("objects", List.of()); model.addAttribute("formOptions", vpdPolicyService.emptyFormOptions()); } - return "vpd-policies"; } @PostMapping("/vpd-policies") @@ -52,6 +62,41 @@ public class VpdPolicyController { @RequestParam(defaultValue = "false") boolean updateCheck, @RequestParam(required = false) String filterPredicate, RedirectAttributes redirectAttributes + ) { + createPolicyInternal(objectKey, policyName, functionKey, functionOwner, functionName, statementTypes, enabled, + updateCheck, filterPredicate, redirectAttributes); + return "redirect:/vpd-policies"; + } + + @PostMapping("/vpd-filter-policies") + public String createFilterPolicy( + @RequestParam String objectKey, + @RequestParam String policyName, + @RequestParam(required = false) String functionKey, + @RequestParam(required = false) String functionOwner, + @RequestParam(required = false) String functionName, + @RequestParam(defaultValue = "SELECT") List statementTypes, + @RequestParam(defaultValue = "false") boolean enabled, + @RequestParam(defaultValue = "false") boolean updateCheck, + @RequestParam(required = false) String filterPredicate, + RedirectAttributes redirectAttributes + ) { + createPolicyInternal(objectKey, policyName, functionKey, functionOwner, functionName, statementTypes, enabled, + updateCheck, filterPredicate, redirectAttributes); + return "redirect:/vpd-filter-policies"; + } + + private void createPolicyInternal( + String objectKey, + String policyName, + String functionKey, + String functionOwner, + String functionName, + List statementTypes, + boolean enabled, + boolean updateCheck, + String filterPredicate, + RedirectAttributes redirectAttributes ) { try { String[] objectParts = objectKey.split("\\.", 2); @@ -77,7 +122,6 @@ public class VpdPolicyController { RuntimeErrorMessage message = RuntimeErrorMessages.dataAccess(exception); redirectAttributes.addFlashAttribute("errorMessage", message.message()); } - return "redirect:/vpd-policies"; } @PostMapping("/vpd-policies/bulk") @@ -93,6 +137,43 @@ public class VpdPolicyController { @RequestParam(defaultValue = "false") boolean updateCheck, @RequestParam(required = false) String filterPredicate, RedirectAttributes redirectAttributes + ) { + bulkApplyPolicyInternal(schemaOwner, includeTables, includeViews, functionKey, functionOwner, functionName, + statementTypes, enabled, updateCheck, filterPredicate, redirectAttributes); + return "redirect:/vpd-policies"; + } + + @PostMapping("/vpd-filter-policies/bulk") + public String bulkApplyFilterPolicy( + @RequestParam String schemaOwner, + @RequestParam(defaultValue = "false") boolean includeTables, + @RequestParam(defaultValue = "false") boolean includeViews, + @RequestParam(required = false) String functionKey, + @RequestParam(required = false) String functionOwner, + @RequestParam(required = false) String functionName, + @RequestParam(defaultValue = "SELECT") List statementTypes, + @RequestParam(defaultValue = "false") boolean enabled, + @RequestParam(defaultValue = "false") boolean updateCheck, + @RequestParam(required = false) String filterPredicate, + RedirectAttributes redirectAttributes + ) { + bulkApplyPolicyInternal(schemaOwner, includeTables, includeViews, functionKey, functionOwner, functionName, + statementTypes, enabled, updateCheck, filterPredicate, redirectAttributes); + return "redirect:/vpd-filter-policies"; + } + + private void bulkApplyPolicyInternal( + String schemaOwner, + boolean includeTables, + boolean includeViews, + String functionKey, + String functionOwner, + String functionName, + List statementTypes, + boolean enabled, + boolean updateCheck, + String filterPredicate, + RedirectAttributes redirectAttributes ) { try { var result = vpdPolicyService.bulkApplySchema( @@ -114,7 +195,6 @@ public class VpdPolicyController { RuntimeErrorMessage message = RuntimeErrorMessages.dataAccess(exception); redirectAttributes.addFlashAttribute("errorMessage", message.message()); } - return "redirect:/vpd-policies"; } @GetMapping("/vpd-policies/function-source") diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html index bcc4085..44309c0 100644 --- a/src/main/resources/templates/fragments/layout.html +++ b/src/main/resources/templates/fragments/layout.html @@ -45,6 +45,7 @@ diff --git a/src/main/resources/templates/vpd-filter-policies.html b/src/main/resources/templates/vpd-filter-policies.html new file mode 100644 index 0000000..589abea --- /dev/null +++ b/src/main/resources/templates/vpd-filter-policies.html @@ -0,0 +1,163 @@ + + + + + +
+
+

Filter Policy 관리

+

VPD filter predicate와 policy function을 등록하고, 단건 또는 스키마 단위로 DBMS_RLS policy를 적용합니다.

+
+ +
+ 조회할 수 없습니다. + message +
+
등록되었습니다.
+
처리할 수 없습니다.
+ +
+
+

Filter Policy 등록

+ 적용 현황 보기 +
+
+ + + + + + +
+ Statement Types +
+ +
+
+
+ + +
+
+ + +
+ +
+ + + + +
+ +
+
+ +
+
+

스키마 벌크 적용

+
+
+ + +
+ Object Types +
+ + +
+
+ +
+ Statement Types +
+ +
+
+
+ + +
+ + +
+
+
+ + +