fix #477: use common vpd policy name by default

This commit is contained in:
devmrko
2026-06-26 07:53:52 +09:00
parent 453dac6e5d
commit 74fbd9a2b2

View File

@@ -1,16 +1,20 @@
package com.cloudhandson.vpdbackoffice.service; package com.cloudhandson.vpdbackoffice.service;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdBulkApplyResult; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdBulkApplyResult;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdFunctionOption;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdFunctionSource; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdFunctionSource;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdObjectFilterDetail; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdObjectFilterDetail;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyCreateCommand; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyCreateCommand;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyDetail; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyDetail;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyExplanation; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyExplanation;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyFormOptions; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyFormOptions;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyTemplateOption;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdSchemaObjectOption; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdSchemaObjectOption;
import com.cloudhandson.vpdbackoffice.domain.vpd.VpdTargetView; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdTargetView;
import com.cloudhandson.vpdbackoffice.mapper.VpdPolicyMapper; import com.cloudhandson.vpdbackoffice.mapper.VpdPolicyMapper;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@@ -26,6 +30,8 @@ public class VpdPolicyService {
private static final Set<String> ALLOWED_STATEMENTS = Set.of("SELECT", "INSERT", "UPDATE", "DELETE", "INDEX"); private static final Set<String> ALLOWED_STATEMENTS = Set.of("SELECT", "INSERT", "UPDATE", "DELETE", "INDEX");
private static final long CATALOG_CACHE_MILLIS = 60_000L; private static final long CATALOG_CACHE_MILLIS = 60_000L;
private static final String COMMON_POLICY_NAME = "CB_PERMISSION_SELECT_POLICY";
private static final String DEFAULT_PERMISSION_FILTER_FUNCTION = "CB_AGENT_DOC_VPD_FILTER";
private final VpdPolicyMapper mapper; private final VpdPolicyMapper mapper;
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
@@ -64,12 +70,13 @@ public class VpdPolicyService {
if (cached != null && !cached.expired()) { if (cached != null && !cached.expired()) {
return cached.value(); return cached.value();
} }
List<VpdFunctionOption> functions = mapper.findFunctionOptions();
VpdPolicyFormOptions options = new VpdPolicyFormOptions( VpdPolicyFormOptions options = new VpdPolicyFormOptions(
mapper.findPolicyNameOptions(), mapper.findPolicyNameOptions(),
mapper.findSchemaOwnerOptions(), mapper.findSchemaOwnerOptions(),
mapper.findOwnerOptions(), mapper.findOwnerOptions(),
mapper.findFunctionOptions(), functions,
mapper.findPolicyTemplateOptions(), buildPolicyTemplateOptions(functions, mapper.findPolicyTemplateOptions()),
List.of("SELECT", "INSERT", "UPDATE", "DELETE", "INDEX") List.of("SELECT", "INSERT", "UPDATE", "DELETE", "INDEX")
); );
formOptionsCache = new CacheEntry<>(options, System.currentTimeMillis() + CATALOG_CACHE_MILLIS); formOptionsCache = new CacheEntry<>(options, System.currentTimeMillis() + CATALOG_CACHE_MILLIS);
@@ -300,6 +307,32 @@ public class VpdPolicyService {
formOptionsCache = null; formOptionsCache = null;
} }
private List<VpdPolicyTemplateOption> buildPolicyTemplateOptions(
List<VpdFunctionOption> functions,
List<VpdPolicyTemplateOption> existingTemplates
) {
List<VpdPolicyTemplateOption> templates = new ArrayList<>();
functions.stream()
.filter(function -> DEFAULT_PERMISSION_FILTER_FUNCTION.equalsIgnoreCase(function.functionName()))
.findFirst()
.ifPresent(function -> templates.add(new VpdPolicyTemplateOption(
COMMON_POLICY_NAME,
function.owner(),
function.packageName(),
function.functionName(),
"SELECT",
"YES",
"NO"
)));
templates.addAll(existingTemplates);
Map<String, VpdPolicyTemplateOption> uniqueTemplates = new LinkedHashMap<>();
for (VpdPolicyTemplateOption template : templates) {
uniqueTemplates.putIfAbsent(template.label().toUpperCase(Locale.ROOT), template);
}
return List.copyOf(uniqueTemplates.values());
}
private void addPolicy( private void addPolicy(
String objectOwner, String objectOwner,
String objectName, String objectName,
@@ -506,8 +539,7 @@ public class VpdPolicyService {
} }
private String generatedPolicyName(String objectName) { private String generatedPolicyName(String objectName) {
String name = objectName + "_POLICY"; return COMMON_POLICY_NAME;
return name.length() > 128 ? name.substring(0, 128) : name;
} }
private FunctionRef parseFunctionRef(String functionKey) { private FunctionRef parseFunctionRef(String functionKey) {