fix #557: guide permission-driven VPD flow

This commit is contained in:
devmrko
2026-06-29 12:11:25 +09:00
parent fbe3d4682b
commit 908ac9a386
57 changed files with 1952 additions and 312 deletions

View File

@@ -39,7 +39,8 @@ class PermissionServiceTest {
public List<ProtectedColumn> findColumns(long objectId) {
return List.of(
new ProtectedColumn(1L, 1L, "DEPT_CODE", "N", null, "INTERNAL", "NONE"),
new ProtectedColumn(2L, 1L, "OWNER_EMP_NO", "N", null, "INTERNAL", "NONE")
new ProtectedColumn(2L, 1L, "OWNER_EMP_NO", "N", null, "INTERNAL", "NONE"),
new ProtectedColumn(3L, 1L, "TECH_TAG", "N", null, "PUBLIC", "NONE")
);
}
};
@@ -138,6 +139,83 @@ class PermissionServiceTest {
.hasMessageContaining("값이 필요");
}
@Test
void acceptsMultipleTagRulesAsOrCandidates() {
var command = new PermissionSetCommand(
10L,
1L,
"SELECT",
"ALLOW",
List.of(
new RuleCommand(null, "TAG", "spring_boot"),
new RuleCommand(null, "TAG", "oracle_vpd")
),
List.of()
);
permissionService.savePermissionSet(command);
FakePermissionMapper mapper = (FakePermissionMapper) permissionMapper;
assertThat(mapper.insertedRules)
.extracting(PermissionRule::ruleType)
.containsExactly("TAG", "TAG");
assertThat(mapper.insertedRules)
.extracting(PermissionRule::ruleColumn)
.containsExactly(null, null);
assertThat(mapper.insertedRules)
.extracting(PermissionRule::ruleValue)
.containsExactly("SPRING_BOOT", "ORACLE_VPD");
}
@Test
void acceptsMultipleVisibleColumns() {
var command = new PermissionSetCommand(
10L,
1L,
"SELECT",
"ALLOW",
List.of(new RuleCommand("DEPT_CODE", "=", "HR")),
List.of("DEPT_CODE", "OWNER_EMP_NO")
);
permissionService.savePermissionSet(command);
FakePermissionMapper mapper = (FakePermissionMapper) permissionMapper;
assertThat(mapper.insertedVisibleColumns).containsExactly("DEPT_CODE", "OWNER_EMP_NO");
}
@Test
void rejectsTagRuleWithoutValue() {
var command = new PermissionSetCommand(
10L,
1L,
"SELECT",
"ALLOW",
List.of(new RuleCommand(null, "TAG", "")),
List.of()
);
assertThatThrownBy(() -> permissionService.savePermissionSet(command))
.isInstanceOf(AppException.class)
.hasMessageContaining("값이 필요");
}
@Test
void rejectsUnsafeTagValue() {
var command = new PermissionSetCommand(
10L,
1L,
"SELECT",
"ALLOW",
List.of(new RuleCommand(null, "TAG", "SPRING' OR '1'='1")),
List.of()
);
assertThatThrownBy(() -> permissionService.savePermissionSet(command))
.isInstanceOf(AppException.class)
.hasMessageContaining("영문 대문자");
}
@Test
void acceptsDenyPermissionEffect() {
var command = new PermissionSetCommand(
@@ -199,6 +277,7 @@ class PermissionServiceTest {
private static class FakePermissionMapper implements PermissionMapper {
private final List<PermissionRule> insertedRules = new ArrayList<>();
private final List<String> insertedVisibleColumns = new ArrayList<>();
@Override
public List<AppRole> findRoles() {
@@ -304,6 +383,7 @@ class PermissionServiceTest {
@Override
public void insertVisibleColumn(long permissionId, String columnName) {
insertedVisibleColumns.add(columnName);
}
@Override