fix #557: guide permission-driven VPD flow

This commit is contained in:
devmrko
2026-06-29 07:01:53 +09:00
parent 8dc77f87ab
commit fbe3d4682b
24 changed files with 1351 additions and 489 deletions

View File

@@ -1,9 +1,15 @@
package com.cloudhandson.vpdbackoffice.web;
import com.cloudhandson.vpdbackoffice.domain.probe.ProbeCommand;
import com.cloudhandson.vpdbackoffice.domain.protectedobject.ProtectedObject;
import com.cloudhandson.vpdbackoffice.service.BearerTokenService;
import com.cloudhandson.vpdbackoffice.service.OrdsProbeService;
import com.cloudhandson.vpdbackoffice.service.ProtectedObjectService;
import com.cloudhandson.vpdbackoffice.service.VpdPolicyService;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@@ -16,33 +22,58 @@ public class ProbeController {
private final OrdsProbeService probeService;
private final ProtectedObjectService protectedObjectService;
private final BearerTokenService tokenService;
private final VpdPolicyService vpdPolicyService;
public ProbeController(
OrdsProbeService probeService,
ProtectedObjectService protectedObjectService,
BearerTokenService tokenService
BearerTokenService tokenService,
VpdPolicyService vpdPolicyService
) {
this.probeService = probeService;
this.protectedObjectService = protectedObjectService;
this.tokenService = tokenService;
this.vpdPolicyService = vpdPolicyService;
}
@GetMapping("/probe")
public String probe(Model model) {
model.addAttribute("objects", protectedObjectService.findEnabled());
model.addAttribute("tokens", tokenService.findTokenContextOptions());
Set<String> defaultObjectKeys = defaultPermissionObjectKeys();
List<ProtectedObject> objects =
protectedObjectService.findEnabled().stream()
.sorted(Comparator
.comparing((ProtectedObject object) ->
!defaultObjectKeys.contains(object.displayName()))
.thenComparing(ProtectedObject::displayName))
.toList();
model.addAttribute("objects", objects);
model.addAttribute("defaultObjectKeys", defaultObjectKeys);
return "probe";
}
@PostMapping("/probe")
public String run(
@RequestParam(required = false) Long tokenKeyId,
@RequestParam long objectId,
@RequestParam String bearerToken,
@RequestParam(defaultValue = "50") int limit,
Model model
) {
model.addAttribute("result", probeService.runProbe(new ProbeCommand(tokenKeyId, objectId, bearerToken, limit)));
String normalizedToken = bearerToken == null ? "" : bearerToken.trim();
model.addAttribute("result", probeService.runProbe(new ProbeCommand(null, objectId, normalizedToken, limit)));
model.addAttribute("tokenContext", tokenService.findTokenContextByPlainToken(normalizedToken));
model.addAttribute("selectedObject", protectedObjectService.findEnabled().stream()
.filter(object -> object.objectId() == objectId)
.findFirst()
.orElse(null));
return "fragments/probe-result :: result";
}
private Set<String> defaultPermissionObjectKeys() {
Set<String> result = new LinkedHashSet<>();
vpdPolicyService.findPolicies().stream()
.filter(policy -> policy.permissionSystemDefault() && "YES".equalsIgnoreCase(policy.enabled()))
.map(policy -> policy.objectDisplayName().toUpperCase())
.forEach(result::add);
return result;
}
}

View File

@@ -80,6 +80,26 @@ public class VpdPolicyController {
return "redirect:/vpd-policies";
}
@PostMapping("/vpd-policies/default")
public String createDefaultPolicy(
@RequestParam String objectKey,
RedirectAttributes redirectAttributes
) {
try {
vpdPolicyService.createDefaultPermissionPolicy(objectKey);
redirectAttributes.addFlashAttribute(
"successMessage",
"권한체계 자동 필터를 연결했습니다: " + objectKey
);
} catch (AppException exception) {
redirectAttributes.addFlashAttribute("errorMessage", exception.getMessage());
} catch (DataAccessException exception) {
RuntimeErrorMessage message = RuntimeErrorMessages.dataAccess(exception);
redirectAttributes.addFlashAttribute("errorMessage", message.message());
}
return "redirect:/vpd-policies";
}
@PostMapping("/vpd-filter-policies/filters")
public String saveFilter(
@RequestParam(required = false) String functionOwner,