fix #477: use common vpd policy name by default
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user