This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/RANGER-3923 by this push:
new 515a5098b RANGER-4531: updated GdsPolicyEngine with methods to find
datasets/projects for principals
515a5098b is described below
commit 515a5098b9553d87ceae3af03bcdf47d7d259501
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Tue Nov 14 18:31:08 2023 -0800
RANGER-4531: updated GdsPolicyEngine with methods to find datasets/projects
for principals
---
.../policyengine/gds/GdsDataShareEvaluator.java | 52 ++++-
.../policyengine/gds/GdsDatasetEvaluator.java | 38 ++-
.../plugin/policyengine/gds/GdsDipEvaluator.java | 28 +--
.../plugin/policyengine/gds/GdsDshidEvaluator.java | 31 ++-
.../plugin/policyengine/gds/GdsPolicyEngine.java | 228 ++++++++++++++++--
.../policyengine/gds/GdsProjectEvaluator.java | 16 +-
.../gds/GdsSharedResourceEvaluator.java | 4 +-
.../policyevaluator/RangerPolicyEvaluator.java | 43 +++-
.../policyengine/gds/TestGdsPolicyEngine.java | 75 ++++--
.../resources/policyengine/gds/gds_info_hive.json | 153 ------------
.../gds/test_gds_policy_engine_hive.json | 259 ++++++++++++++++-----
11 files changed, 638 insertions(+), 289 deletions(-)
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
index 4936a86ed..95f06209d 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
@@ -43,9 +43,10 @@ public class GdsDataShareEvaluator {
private final DataShareInfo
dsh;
private final String
name;
private final String
zoneName;
- private final Map<String, RangerResourceTrie<GdsSharedResourceEvaluator>>
resourceTries = new HashMap<>();
- private final List<GdsDshidEvaluator>
dsidEvaluators = new ArrayList<>();
private final RangerConditionEvaluator
conditionEvaluator;
+ private final List<GdsSharedResourceEvaluator>
evaluators;
+ private final Map<String, RangerResourceTrie<GdsSharedResourceEvaluator>>
resourceTries;
+ private final List<GdsDshidEvaluator>
dsidEvaluators = new ArrayList<>();
public GdsDataShareEvaluator(DataShareInfo dsh, List<SharedResourceInfo>
resources, RangerServiceDefHelper serviceDefHelper) {
LOG.debug("==> GdsDataShareEvaluator({}, {})", dsh, resources);
@@ -56,8 +57,10 @@ public class GdsDataShareEvaluator {
this.conditionEvaluator =
RangerCustomConditionEvaluator.getInstance().getExpressionEvaluator(dsh.getConditionExpr(),
serviceDefHelper.getServiceDef());
if (resources != null) {
- Set<String> resourceKeys = new HashSet<>();
- List<GdsSharedResourceEvaluator> evaluators = new
ArrayList<>(resources.size());
+ Set<String> resourceKeys = new HashSet<>();
+
+ evaluators = new ArrayList<>(resources.size());
+ resourceTries = new HashMap<>();
for (SharedResourceInfo resource : resources) {
GdsSharedResourceEvaluator evaluator = new
GdsSharedResourceEvaluator(resource, dsh.getDefaultAccessTypes(),
serviceDefHelper);
@@ -73,6 +76,9 @@ public class GdsDataShareEvaluator {
resourceTries.put(resourceKey, resourceTrie);
}
+ } else {
+ evaluators = Collections.emptyList();
+ resourceTries = Collections.emptyMap();
}
LOG.debug("<== GdsDataShareEvaluator({}, {})", dsh, resources);
@@ -90,8 +96,34 @@ public class GdsDataShareEvaluator {
return zoneName;
}
- public void addDshidEvaluator(GdsDshidEvaluator dhidEvaluator) {
- dsidEvaluators.add(dhidEvaluator);
+ public List<GdsSharedResourceEvaluator> getSharedResourceEvaluators() {
return evaluators; }
+
+ public boolean isInDataset(long datasetId) {
+ boolean ret = false;
+
+ for (GdsDshidEvaluator dsidEvaluator : dsidEvaluators) {
+ if (dsidEvaluator.getDatasetId().equals(datasetId)) {
+ ret = true;
+
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ public boolean isInProject(long projectId) {
+ boolean ret = false;
+
+ for (GdsDshidEvaluator dsidEvaluator : dsidEvaluators) {
+ if (dsidEvaluator.getDatasetEvaluator().isInProject(projectId)) {
+ ret = true;
+
+ break;
+ }
+ }
+
+ return ret;
}
public void evaluate(RangerAccessRequest request, GdsAccessResult result,
Set<Long> datasetIds) {
@@ -141,7 +173,7 @@ public class GdsDataShareEvaluator {
LOG.debug("<== GdsDataShareEvaluator.evaluate({}, {})", request,
result);
}
- public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, Map<Long, GdsDatasetEvaluator> datasets, Map<Long,
GdsProjectEvaluator> projects) {
+ public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls) {
LOG.debug("==> GdsDataShareEvaluator.getResourceACLs({}, {})",
request, acls);
List<GdsSharedResourceEvaluator> evaluators =
getResourceEvaluators(request);
@@ -150,13 +182,17 @@ public class GdsDataShareEvaluator {
boolean isConditional = conditionEvaluator != null;
for (GdsSharedResourceEvaluator evaluator : evaluators) {
- evaluator.getResourceACLs(request, acls, isConditional,
dsidEvaluators, datasets, projects);
+ evaluator.getResourceACLs(request, acls, isConditional,
dsidEvaluators);
}
}
LOG.debug("<== GdsDataShareEvaluator.getResourceACLs({}, {})",
request, acls);
}
+ void addDshidEvaluator(GdsDshidEvaluator dhidEvaluator) {
+ dsidEvaluators.add(dhidEvaluator);
+ }
+
private List<GdsSharedResourceEvaluator>
getResourceEvaluators(RangerAccessRequest request) {
final List<GdsSharedResourceEvaluator> ret;
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDatasetEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDatasetEvaluator.java
index aa9fbea7c..4b5ef755e 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDatasetEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDatasetEvaluator.java
@@ -77,8 +77,18 @@ public class GdsDatasetEvaluator {
return name;
}
- public void addDipEvaluator(GdsDipEvaluator dipEvaluator) {
- dipEvaluators.add(dipEvaluator);
+ public boolean isInProject(long projectId) {
+ boolean ret = false;
+
+ for (GdsDipEvaluator dipEvaluator : dipEvaluators) {
+ if (dipEvaluator.getProjectId().equals(projectId)) {
+ ret = true;
+
+ break;
+ }
+ }
+
+ return ret;
}
public void evaluate(RangerAccessRequest request, GdsAccessResult result,
Set<Long> projectIds) {
@@ -118,7 +128,7 @@ public class GdsDatasetEvaluator {
LOG.debug("<== GdsDatasetEvaluator.evaluate({}, {})", request, result);
}
- public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Set<String> allowedAccessTypes,
Map<Long, GdsProjectEvaluator> projects) {
+ public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Set<String> allowedAccessTypes)
{
acls.getDatasets().add(getName());
if (!policyEvaluators.isEmpty()) {
@@ -130,11 +140,29 @@ public class GdsDatasetEvaluator {
}
for (GdsDipEvaluator dipEvaluator : dipEvaluators) {
- dipEvaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes, projects);
+ dipEvaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes);
}
}
- public static class GdsDatasetAccessRequest extends
RangerAccessRequestImpl {
+ public boolean hasReference(Set<String> users, Set<String> groups,
Set<String> roles) {
+ boolean ret = false;
+
+ for (RangerPolicyEvaluator policyEvaluator : policyEvaluators) {
+ ret = policyEvaluator.hasReference(users, groups, roles);
+
+ if (ret) {
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ void addDipEvaluator(GdsDipEvaluator dipEvaluator) {
+ dipEvaluators.add(dipEvaluator);
+ }
+
+ private static class GdsDatasetAccessRequest extends
RangerAccessRequestImpl {
public GdsDatasetAccessRequest(Long datasetId, RangerServiceDef
gdsServiceDef, RangerAccessRequest request) {
super.setResource(new RangerDatasetResource(datasetId,
gdsServiceDef, request.getResource().getOwnerUser()));
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDipEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDipEvaluator.java
index a5256ca4c..ec81b4c3e 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDipEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDipEvaluator.java
@@ -27,17 +27,18 @@ import
org.apache.ranger.plugin.util.ServiceGdsInfo.DatasetInProjectInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Map;
import java.util.Set;
public class GdsDipEvaluator {
private static final Logger LOG =
LoggerFactory.getLogger(GdsDipEvaluator.class);
private final DatasetInProjectInfo dip;
+ private final GdsProjectEvaluator projectEvaluator;
private final RangerValidityScheduleEvaluator scheduleEvaluator;
- public GdsDipEvaluator(DatasetInProjectInfo dip) {
- this.dip = dip;
+ public GdsDipEvaluator(DatasetInProjectInfo dip, GdsProjectEvaluator
projectEvaluator) {
+ this.dip = dip;
+ this.projectEvaluator = projectEvaluator;
if (dip.getValiditySchedule() != null) {
scheduleEvaluator = new
RangerValidityScheduleEvaluator(dip.getValiditySchedule());
@@ -46,14 +47,16 @@ public class GdsDipEvaluator {
}
}
- public long getDatasetId() {
+ public Long getDatasetId() {
return dip.getDatasetId();
}
- public long getProjectId() {
+ public Long getProjectId() {
return dip.getProjectId();
}
+ public GdsProjectEvaluator getProjectEvaluator() { return
projectEvaluator; }
+
public boolean isAllowed(RangerAccessRequest request) {
boolean ret = isActive();
@@ -64,21 +67,12 @@ public class GdsDipEvaluator {
return ret;
}
-
- public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Set<String> allowedAccessTypes,
Map<Long, GdsProjectEvaluator> projects) {
+ public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Set<String> allowedAccessTypes)
{
LOG.debug("==> GdsDipEvaluator.getResourceACLs({}, {})", request,
acls);
- if (dip.getStatus() == RangerGds.GdsShareStatus.ACTIVE) {
- GdsProjectEvaluator evaluator = projects.get(dip.getProjectId());
+ isConditional = isConditional || scheduleEvaluator != null;
- if (evaluator != null) {
- isConditional = isConditional || scheduleEvaluator != null;
-
- evaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes);
- } else {
- LOG.warn("GdsDipEvaluator.getResourceACLs({}): evaluator for
projectId={} not found", request, dip.getProjectId());
- }
- }
+ projectEvaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes);
LOG.debug("<== GdsDipEvaluator.getResourceACLs({}, {})", request,
acls);
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDshidEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDshidEvaluator.java
index c32f22b27..c56c55f77 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDshidEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDshidEvaluator.java
@@ -27,17 +27,18 @@ import
org.apache.ranger.plugin.util.ServiceGdsInfo.DataShareInDatasetInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Map;
import java.util.Set;
public class GdsDshidEvaluator {
private static final Logger LOG =
LoggerFactory.getLogger(GdsDshidEvaluator.class);
- private final DataShareInDatasetInfo dshid;
+ private final DataShareInDatasetInfo dshid;
+ private final GdsDatasetEvaluator datasetEvaluator;;
private final RangerValidityScheduleEvaluator scheduleEvaluator;
- public GdsDshidEvaluator(DataShareInDatasetInfo dshid) {
- this.dshid = dshid;
+ public GdsDshidEvaluator(DataShareInDatasetInfo dshid, GdsDatasetEvaluator
datasetEvaluator) {
+ this.dshid = dshid;
+ this.datasetEvaluator = datasetEvaluator;
if (dshid.getValiditySchedule() != null) {
scheduleEvaluator = new
RangerValidityScheduleEvaluator(dshid.getValiditySchedule());
@@ -46,14 +47,18 @@ public class GdsDshidEvaluator {
}
}
- public long getDataShareId() {
+ public Long getDataShareId() {
return dshid.getDataShareId();
}
- public long getDatasetId() {
+ public Long getDatasetId() {
return dshid.getDatasetId();
}
+ public GdsDatasetEvaluator getDatasetEvaluator() {
+ return datasetEvaluator;
+ }
+
public boolean isAllowed(RangerAccessRequest request) {
boolean ret = isActive();
@@ -64,20 +69,12 @@ public class GdsDshidEvaluator {
return ret;
}
- public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Map<Long, GdsDatasetEvaluator>
datasets, Map<Long, GdsProjectEvaluator> projects, Set<String>
allowedAccessTypes) {
+ public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, Set<String> allowedAccessTypes)
{
LOG.debug("==> GdsDshidEvaluator.getResourceACLs({}, {})", request,
acls);
- if (dshid.getStatus() == RangerGds.GdsShareStatus.ACTIVE) {
- GdsDatasetEvaluator datasetEvaluator =
datasets.get(dshid.getDatasetId());
+ isConditional = isConditional || scheduleEvaluator != null;
- if (datasetEvaluator != null) {
- isConditional = isConditional || scheduleEvaluator != null;
-
- datasetEvaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes, projects);
- } else {
- LOG.warn("GdsDshidEvaluator.getResourceACLs({}):
datasetEvaluator for datasetId={} not found", request, dshid.getDatasetId());
- }
- }
+ datasetEvaluator.getResourceACLs(request, acls, isConditional,
allowedAccessTypes);
LOG.debug("<== GdsDshidEvaluator.getResourceACLs({}, {})", request,
acls);
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
index 337134fe4..541f0754e 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
@@ -114,7 +114,7 @@ public class GdsPolicyEngine {
}
for (GdsDataShareEvaluator dshEvaluator : dataShares) {
- dshEvaluator.getResourceACLs(request, ret, datasets, projects);
+ dshEvaluator.getResourceACLs(request, ret);
}
}
@@ -123,6 +123,57 @@ public class GdsPolicyEngine {
return ret;
}
+ public Set<String> getDatasetsForPrincipals(Set<String> users, Set<String>
groups, Set<String> roles) {
+ Set<String> ret = new HashSet<>();
+
+ for (GdsDatasetEvaluator dataset : datasets.values()) {
+ if (dataset.hasReference(users, groups, roles)) {
+ ret.add(dataset.getName());
+ }
+ }
+
+ return ret;
+ }
+
+ public Set<String> getProjectsForPrincipals(Set<String> users, Set<String>
groups, Set<String> roles) {
+ Set<String> ret = new HashSet<>();
+
+ for (GdsProjectEvaluator project : projects.values()) {
+ if (project.hasReference(users, groups, roles)) {
+ ret.add(project.getName());
+ }
+ }
+
+ return ret;
+ }
+
+ public long getDatasetId(String datasetName) {
+ GdsDatasetEvaluator evaluator = getDatasetEvaluator(datasetName);
+
+ return evaluator == null ? -1 : evaluator.getId();
+ }
+
+ public long getProjectId(String projectName) {
+ GdsProjectEvaluator evaluator = getProjectEvaluator(projectName);
+
+ return evaluator == null ? -1 : evaluator.getId();
+ }
+
+ public Iterator<GdsSharedResourceEvaluator> getDatasetResources(long
datasetId) {
+ return new
SharedResourceIter(getDataSharesForDataset(datasetId).listIterator());
+ }
+
+ public Iterator<GdsSharedResourceEvaluator> getProjectResources(long
projectId) {
+ return new
SharedResourceIter(getDataSharesForProject(projectId).listIterator());
+ }
+
+ public Iterator<GdsSharedResourceEvaluator> getDataShareResources(long
dataShareId) {
+ GdsDataShareEvaluator evaluator =
getDataShareEvaluator(dataShareId);
+ List<GdsDataShareEvaluator> evaluators = evaluator == null ?
Collections.emptyList() : Collections.singletonList(evaluator);
+
+ return new SharedResourceIter(evaluators.listIterator());
+ }
+
private void init(RangerServiceDefHelper serviceDefHelper,
RangerPluginContext pluginContext) {
LOG.debug("==> RangerGdsPolicyEngine.init()");
@@ -180,7 +231,15 @@ public class GdsPolicyEngine {
continue;
}
- GdsDshidEvaluator dshidEvaluator = new
GdsDshidEvaluator(dshid);
+ GdsDatasetEvaluator datasetEvaluator =
datasets.get(dshid.getDatasetId());
+
+ if (datasetEvaluator == null) {
+ LOG.error("RangerGdsPolicyEngine(): invalid datasetId in
dshid: {}. Ignored", dshid);
+
+ continue;
+ }
+
+ GdsDshidEvaluator dshidEvaluator = new
GdsDshidEvaluator(dshid, datasetEvaluator);
dshEvaluator.addDshidEvaluator(dshidEvaluator);
}
@@ -202,7 +261,15 @@ public class GdsPolicyEngine {
continue;
}
- GdsDipEvaluator dipEvaluator = new GdsDipEvaluator(dip);
+ GdsProjectEvaluator projectEvaluator =
projects.get(dip.getProjectId());
+
+ if (projectEvaluator == null) {
+ LOG.error("RangerGdsPolicyEngine(): invalid projectId in
dip: {}. Ignored", dip);
+
+ continue;
+ }
+
+ GdsDipEvaluator dipEvaluator = new GdsDipEvaluator(dip,
projectEvaluator);
datasetEvaluator.addDipEvaluator(dipEvaluator);
}
@@ -311,27 +378,162 @@ public class GdsPolicyEngine {
evaluator.evaluate(request, result);
}
}
+
+ private GdsDatasetEvaluator getDatasetEvaluator(String dsName) {
+ GdsDatasetEvaluator ret = null;
+
+ for (GdsDatasetEvaluator evaluator : datasets.values()) {
+ if (StringUtils.equals(evaluator.getName(), dsName)) {
+ ret = evaluator;
+
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ private GdsProjectEvaluator getProjectEvaluator(String projectName) {
+ GdsProjectEvaluator ret = null;
+
+ for (GdsProjectEvaluator evaluator : projects.values()) {
+ if (StringUtils.equals(evaluator.getName(), projectName)) {
+ ret = evaluator;
+
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ private GdsDataShareEvaluator getDataShareEvaluator(long dataShareId) {
+ GdsDataShareEvaluator ret = null;
+
+ for (List<GdsDataShareEvaluator> dshEvaluators :
zoneDataShares.values()) {
+ for (GdsDataShareEvaluator dshEvaluator : dshEvaluators) {
+ if (dshEvaluator.getId().equals(dataShareId)) {
+ ret = dshEvaluator;
+
+ break;
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ private List<GdsDataShareEvaluator> getDataSharesForDataset(long
datasetId) {
+ Set<GdsDataShareEvaluator> evaluators = null;
+
+ for (List<GdsDataShareEvaluator> dshEvaluators :
zoneDataShares.values()) {
+ for (GdsDataShareEvaluator dshEvaluator : dshEvaluators) {
+ if (dshEvaluator.isInDataset(datasetId)) {
+ if (evaluators == null) {
+ evaluators = new HashSet<>();
+ }
+
+ evaluators.add(dshEvaluator);
+ }
+ }
+ }
+
+ List<GdsDataShareEvaluator> ret = (evaluators == null) ?
Collections.emptyList() : new ArrayList<>(evaluators);
+
+ if (ret.size() > 1) {
+ ret.sort(GdsDataShareEvaluator.EVAL_ORDER_COMPARATOR);
+ }
+
+ return ret;
+ }
+
+ private List<GdsDataShareEvaluator> getDataSharesForProject(long
projectId) {
+ Set<GdsDataShareEvaluator> evaluators = null;
+
+ for (List<GdsDataShareEvaluator> dshEvaluators :
zoneDataShares.values()) {
+ for (GdsDataShareEvaluator dshEvaluator : dshEvaluators) {
+ if (dshEvaluator.isInProject(projectId)) {
+ if (evaluators == null) {
+ evaluators = new HashSet<>();
+ }
+
+ evaluators.add(dshEvaluator);
+ }
+ }
+ }
+
+ List<GdsDataShareEvaluator> ret = (evaluators == null) ?
Collections.emptyList() : new ArrayList<>(evaluators);
+
+ if (ret.size() > 1) {
+ ret.sort(GdsDataShareEvaluator.EVAL_ORDER_COMPARATOR);
+ }
+
+ return ret;
+ }
+
+ static class SharedResourceIter implements
Iterator<GdsSharedResourceEvaluator> {
+ private final Iterator<GdsDataShareEvaluator> dataShareIter;
+ private Iterator<GdsSharedResourceEvaluator> sharedResourceIter;
+ private GdsSharedResourceEvaluator nextResource;
+
+ SharedResourceIter(Iterator<GdsDataShareEvaluator> dataShareIter) {
+ this.dataShareIter = dataShareIter;
+ this.sharedResourceIter = Collections.emptyIterator();
+ this.nextResource = null;
+
+ setNext();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return nextResource != null;
+ }
+
+ @Override
+ public GdsSharedResourceEvaluator next() {
+ GdsSharedResourceEvaluator ret = nextResource;
+
+ if (ret != null) {
+ setNext();
+ }
+
+ return ret;
+ }
+
+ private void setNext() {
+ if (!sharedResourceIter.hasNext()) {
+ while (dataShareIter.hasNext()) {
+ GdsDataShareEvaluator dataShareEvaluator =
dataShareIter.next();
+
+ sharedResourceIter =
dataShareEvaluator.getSharedResourceEvaluators().iterator();
+
+ if (sharedResourceIter.hasNext()) {
+ break;
+ }
+ }
+ }
+
+ nextResource = sharedResourceIter.hasNext() ?
sharedResourceIter.next() : null;
+ }
+ }
}
/*
dataShare-1 ----------------------- dataset-1 ---
- resource-1 / \
- resource-2 / \
+ resource-11 / \
+ resource-12 / \
/ \
dataShare-2 -------------------| | ---- project-1
- resource-3 \ /
- \ /
+ resource-21 \ /
+ resource-22 \ /
-- dataset-2---
/
dataShare-3 ---------------------
- resource-3
- resource-4
+ resource-31
dataShare-4 ------------------------- dataset-3 --------- project-2
- resource-4
- resource-5
+ resource-41
dataShare-5 ------------------------- dataset-4
- resource-6
- resource-7
+ resource-51
*/
\ No newline at end of file
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsProjectEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsProjectEvaluator.java
index 17a86163b..87175ea5c 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsProjectEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsProjectEvaluator.java
@@ -119,8 +119,22 @@ public class GdsProjectEvaluator {
}
}
+ public boolean hasReference(Set<String> users, Set<String> groups,
Set<String> roles) {
+ boolean ret = false;
- public static class GdsProjectAccessRequest extends
RangerAccessRequestImpl {
+ for (RangerPolicyEvaluator policyEvaluator : policyEvaluators) {
+ ret = policyEvaluator.hasReference(users, groups, roles);
+
+ if (ret) {
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+
+ private static class GdsProjectAccessRequest extends
RangerAccessRequestImpl {
public GdsProjectAccessRequest(Long projectId, RangerServiceDef
gdsServiceDef, RangerAccessRequest request) {
super.setResource(new RangerProjectResource(projectId,
gdsServiceDef, request.getResource().getOwnerUser()));
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
index 726331271..2e073bb1c 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
@@ -137,7 +137,7 @@ public class GdsSharedResourceEvaluator implements
RangerResourceEvaluator {
return ret;
}
- public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, List<GdsDshidEvaluator>
dshidEvaluators, Map<Long, GdsDatasetEvaluator> datasets, Map<Long,
GdsProjectEvaluator> projects) {
+ public void getResourceACLs(RangerAccessRequest request,
RangerResourceACLs acls, boolean isConditional, List<GdsDshidEvaluator>
dshidEvaluators) {
LOG.debug("==> GdsSharedResourceEvaluator.getResourceACLs({}, {})",
request, acls);
boolean isResourceMatch =
policyResourceMatcher.isMatch(request.getResource(),
request.getResourceElementMatchingScopes(), request.getContext());
@@ -146,7 +146,7 @@ public class GdsSharedResourceEvaluator implements
RangerResourceEvaluator {
isConditional = isConditional || conditionEvaluator != null;
for (GdsDshidEvaluator dshidEvaluator : dshidEvaluators) {
- dshidEvaluator.getResourceACLs(request, acls, isConditional,
datasets, projects, getAllowedAccessTypes());
+ dshidEvaluator.getResourceACLs(request, acls, isConditional,
getAllowedAccessTypes());
}
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java
index 2856ccc6b..e0a9aa987 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerPolicyEvaluator.java
@@ -39,6 +39,7 @@ import
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemAccess;
import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
import org.apache.ranger.plugin.model.RangerPolicy.RangerRowFilterPolicyItem;
+import org.apache.ranger.plugin.model.RangerPrincipal;
import org.apache.ranger.plugin.model.RangerServiceDef;
import org.apache.ranger.plugin.policyengine.PolicyEngine;
import org.apache.ranger.plugin.policyengine.RangerResourceAccessInfo;
@@ -150,7 +151,37 @@ public interface RangerPolicyEvaluator {
return false;
}
- default boolean hasRoles(final RangerPolicy policy) {
+ default boolean hasReference(Set<String> users, Set<String> groups,
Set<String> roles) {
+ RangerPolicy policy = getPolicy();
+
+ for (RangerPolicyItem policyItem : policy.getPolicyItems()) {
+ if (hasReference(policyItem, users, groups, roles)) {
+ return true;
+ }
+ }
+
+ for (RangerPolicyItem policyItem : policy.getDenyPolicyItems())
{
+ if (hasReference(policyItem, users, groups, roles)) {
+ return true;
+ }
+ }
+
+ for (RangerPolicyItem policyItem : policy.getAllowExceptions())
{
+ if (hasReference(policyItem, users, groups, roles)) {
+ return true;
+ }
+ }
+
+ for (RangerPolicyItem policyItem : policy.getDenyExceptions()) {
+ if (hasReference(policyItem, users, groups, roles)) {
+ return true;
+ }
+ }
+ return false;
+
+ }
+
+ default boolean hasRoles(final RangerPolicy policy) {
for (RangerPolicyItem policyItem : policy.getPolicyItems()) {
if (hasRoles(policyItem)) {
return true;
@@ -188,6 +219,12 @@ public interface RangerPolicyEvaluator {
return CollectionUtils.isNotEmpty(policyItem.getConditions())
|| policyItem.getUsers().contains(RangerPolicyEngine.RESOURCE_OWNER); /* ||
policyItem.getGroups().contains(RangerPolicyEngine.RESOURCE_GROUP_OWNER) */
}
+ static boolean hasReference(RangerPolicyItem policyItem, Set<String>
users, Set<String> groups, Set<String> roles) {
+ return containsAny(policyItem.getUsers(), users) ||
+ containsAny(policyItem.getGroups(), groups) ||
+ containsAny(policyItem.getRoles(), roles);
+ }
+
static boolean hasRoles(RangerPolicyItem policyItem) {
return CollectionUtils.isNotEmpty(policyItem.getRoles());
}
@@ -200,6 +237,10 @@ public interface RangerPolicyEvaluator {
}
}
+ static boolean containsAny(Collection<String> coll1, Collection<String>
coll2) {
+ return coll1 != null && coll2 != null &&
CollectionUtils.containsAny(coll1, coll2);
+ }
+
class PolicyEvalOrderComparator implements
Comparator<RangerPolicyEvaluator>, Serializable {
@Override
public int compare(RangerPolicyEvaluator me,
RangerPolicyEvaluator other) {
diff --git
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/gds/TestGdsPolicyEngine.java
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/gds/TestGdsPolicyEngine.java
index 9d1560562..fb6d593e9 100644
---
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/gds/TestGdsPolicyEngine.java
+++
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/gds/TestGdsPolicyEngine.java
@@ -83,20 +83,62 @@ public class TestGdsPolicyEngine {
GdsPolicyEngine policyEngine = new
GdsPolicyEngine(testCase.gdsInfo, new
RangerServiceDefHelper(testCase.serviceDef, false), pluginContext);
for (TestData test : testCase.tests) {
- Set<String> zoneNames =
zoneMatcher.getZonesForResourceAndChildren(test.request.getResource());
+ if (test.request != null) {
+ Set<String> zoneNames =
zoneMatcher.getZonesForResourceAndChildren(test.request.getResource());
-
RangerAccessRequestUtil.setResourceZoneNamesInContext(test.request, zoneNames);
+
RangerAccessRequestUtil.setResourceZoneNamesInContext(test.request, zoneNames);
- if (test.result != null) {
- GdsAccessResult result = policyEngine.evaluate(test.request);
+ if (test.result != null) {
+ GdsAccessResult result =
policyEngine.evaluate(test.request);
- assertEquals(test.name, test.result, result);
- }
+ assertEquals(test.name, test.result, result);
+ }
+
+ if (test.acls != null) {
+ RangerResourceACLs acls =
policyEngine.getResourceACLs(test.request);
+
+ assertEquals(test.name, test.acls, acls);
+ }
+ } else if (test.principals != null) {
+ Set<String> users = test.principals.get("users");
+ Set<String> groups = test.principals.get("groups");
+ Set<String> roles = test.principals.get("roles");
+
+ if (test.datasets != null) {
+ Set<String> datasets =
policyEngine.getDatasetsForPrincipals(users, groups, roles);
+
+ assertEquals(test.name, test.datasets, datasets);
+ }
+
+ if (test.projects != null) {
+ Set<String> projects =
policyEngine.getProjectsForPrincipals(users, groups, roles);
+
+ assertEquals(test.name, test.projects, projects);
+ }
+ } else if (test.resourceIds != null) {
+ Set<Long> resourceIds = new HashSet<>();
+
+ if (test.datasetId != null) {
+ Iterator<GdsSharedResourceEvaluator> iter =
policyEngine.getDatasetResources(test.datasetId);
+
+ while (iter.hasNext()) {
+ resourceIds.add(iter.next().getId());
+ }
+ } else if (test.projectId != null) {
+ Iterator<GdsSharedResourceEvaluator> iter =
policyEngine.getProjectResources(test.projectId);
+
+ while (iter.hasNext()) {
+ resourceIds.add(iter.next().getId());
+ }
+ } else if (test.dataShareId != null) {
+ Iterator<GdsSharedResourceEvaluator> iter =
policyEngine.getDataShareResources(test.dataShareId);
- if (test.acls != null) {
- RangerResourceACLs acls =
policyEngine.getResourceACLs(test.request);
+ while (iter.hasNext()) {
+ resourceIds.add(iter.next().getId());
+ }
+ }
- assertEquals(test.name, test.acls, acls);
+ assertEquals(test.name, test.resourceIds, resourceIds);
}
}
}
@@ -110,10 +152,17 @@ public class TestGdsPolicyEngine {
}
static class TestData {
- public String name;
- public RangerAccessRequest request;
- public GdsAccessResult result;
- public RangerResourceACLs acls;
+ public String name;
+ public RangerAccessRequest request;
+ public GdsAccessResult result;
+ public RangerResourceACLs acls;
+ public Map<String, Set<String>> principals;
+ public Set<String> datasets;
+ public Set<String> projects;
+ public Long datasetId;
+ public Long projectId;
+ public Long dataShareId;
+ public Set<Long> resourceIds;
}
static class RangerAccessRequestDeserializer implements
JsonDeserializer<RangerAccessRequest> {
diff --git
a/agents-common/src/test/resources/policyengine/gds/gds_info_hive.json
b/agents-common/src/test/resources/policyengine/gds/gds_info_hive.json
deleted file mode 100644
index 34fcc6290..000000000
--- a/agents-common/src/test/resources/policyengine/gds/gds_info_hive.json
+++ /dev/null
@@ -1,153 +0,0 @@
-{
- "serviceName": "dev_hive",
- "dataShares": [
- { "id": 1, "name": "hive-sales-2023", "zoneName": "sales",
"conditionExpr": "", "defaultAccessTypes": [ "_READ" ], "defaultTagMasks": [ ]
},
- { "id": 2, "name": "hive-finance-2023", "zoneName": "finance",
"conditionExpr": "", "defaultAccessTypes": [ "_READ" ], "defaultTagMasks": [ ]
},
- { "id": 3, "name": "hive-shipping-2023", "zoneName": "shipping",
"conditionExpr": "", "defaultAccessTypes": [ "_READ" ], "defaultTagMasks": [ ]
},
- { "id": 4, "name": "hive-new-customers-2023", "zoneName": "",
"conditionExpr": "", "defaultAccessTypes": [ "_READ" ], "defaultTagMasks": [ ]
},
- { "id": 5, "name": "hive-facilities", "zoneName": "",
"conditionExpr": "", "defaultAccessTypes": [ "_READ" ], "defaultTagMasks": [ ] }
- ],
- "dshids": [
- { "dataShareId": 1, "datasetId": 1, "status": "ACTIVE",
"validitySchedule": null },
- { "dataShareId": 2, "datasetId": 1, "status": "ACTIVE",
"validitySchedule": null },
- { "dataShareId": 2, "datasetId": 2, "status": "ACTIVE",
"validitySchedule": null },
- { "dataShareId": 3, "datasetId": 2, "status": "ACTIVE",
"validitySchedule": null },
- { "dataShareId": 4, "datasetId": 3, "status": "ACTIVE",
"validitySchedule": null },
- { "dataShareId": 5, "datasetId": 4, "status": "ACTIVE",
"validitySchedule": null }
- ],
- "dips": [
- { "datasetId": 1, "projectId": 1, "status": "ACTIVE", "validitySchedule":
null },
- { "datasetId": 2, "projectId": 1, "status": "ACTIVE", "validitySchedule":
null },
- { "datasetId": 3, "projectId": 2, "status": "ACTIVE", "validitySchedule":
null }
- ],
- "resources": [
- {
- "id": 11, "dataShareId": 1, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "sales" ] }, "table": {
"values": [ "prospects" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": { }
- },
- {
- "id": 12, "dataShareId": 1, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "sales" ] }, "table": {
"values": [ "orders" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": { }
- },
- {
- "id": 21, "dataShareId": 2, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "finance" ] }, "table": {
"values": [ "invoices" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": { }
- },
- {
- "id": 22, "dataShareId": 2, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "finance" ] }, "table": {
"values": [ "payments" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": { }
- },
- {
- "id": 31, "dataShareId": 3, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "shipping" ] }, "table": {
"values": [ "shipments" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": { }
- },
- {
- "id": 41, "dataShareId": 4, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "customers" ] }, "table": {
"values": [ "contact_info" ] } }, "rowFilter": { "filterExpr": "created_time >=
'2023-01-01' and created_time < '2024-01-01'" },
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": null
- },
- {
- "id": 51, "dataShareId": 5, "conditionExpr": "", "accessTypes": [
"select" ],
- "resource": { "database": { "values": [ "operations" ] }, "table": {
"values": [ "facilities" ] } }, "rowFilter": null,
- "subResourceType": "column", "subResource": { "values": [ "*" ] },
"subResourceMasks": null
- }
- ],
- "datasets": [
- {
- "id": 1,
- "name": "dataset-1",
- "policies": [
- { "id": 2001, "name": "dataset-1", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "dataset-id": { "values": ["1"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"ds-user" ], "groups": []}
- ]
- }
- ]
- },
- {
- "id": 2,
- "name": "dataset-2",
- "policies": [
- { "id": 2002, "name": "dataset-2", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "dataset-id": { "values": ["2"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"ds-user" ], "groups": []}
- ]
- }
- ]
- },
- {
- "id": 3,
- "name": "dataset-3",
- "policies": [
- { "id": 2003, "name": "dataset-3", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "dataset-id": { "values": ["3"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"ds-user" ], "groups": []}
- ]
- }
- ]
- },
- {
- "id": 4,
- "name": "dataset-4",
- "policies": [
- { "id": 2004, "name": "dataset-4", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "dataset-id": { "values": ["4"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"ds-user" ], "groups": []}
- ]
- }
- ]
- }
- ],
- "projects": [
- {
- "id": 1,
- "name": "project-1",
- "policies": [
- { "id": 3001, "name": "project-1", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "project-id": { "values": ["1"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"proj-user" ], "groups": []}
- ]
- }
- ]
- },
- {
- "id": 2,
- "name": "project-2",
- "policies": [
- { "id": 3002, "name": "project-2", "isEnabled": true,
"isAuditEnabled": true,
- "resources": { "project-id": { "values": ["2"] } },
- "policyItems":[
- { "accesses":[ { "type": "_ALL", "isAllowed": true } ], "users": [
"proj-user" ], "groups": []}
- ]
- }
- ]
- }
- ],
- "gdsServiceDef": {
- "name": "gds",
- "id": 3,
- "resources": [
- { "name": "dataset-id", "level":1, "parent": "", "mandatory": true,
"lookupSupported": false, "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
"matcherOptions":{ "wildCard": false, "ignoreCase": true }, "label": "Dataset
ID", "description": "Dataset ID" },
- { "name": "project-id", "level":1, "parent": "", "mandatory": true,
"lookupSupported": false, "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
"matcherOptions":{ "wildCard": false, "ignoreCase": true }, "label": "Project
ID", "description": "Project ID" }
- ],
- "accessTypes":[
- { "itemId": 1, "name": "_CREATE", "label": "_CREATE" },
- { "itemId": 2, "name": "_READ", "label": "_READ" },
- { "itemId": 3, "name": "_UPDATE", "label": "_UPDATE" },
- { "itemId": 4, "name": "_DELETE", "label": "_DELETE" },
- { "itemId": 5, "name": "_MANAGE", "label": "_MANAGE" },
- { "itemId": 6, "name": "_ALL", "label": "_ALL" }
- ]
- },
- "gdsVersion": 1
-}
\ No newline at end of file
diff --git
a/agents-common/src/test/resources/policyengine/gds/test_gds_policy_engine_hive.json
b/agents-common/src/test/resources/policyengine/gds/test_gds_policy_engine_hive.json
index 2ab93bde6..bcdf5a342 100644
---
a/agents-common/src/test/resources/policyengine/gds/test_gds_policy_engine_hive.json
+++
b/agents-common/src/test/resources/policyengine/gds/test_gds_policy_engine_hive.json
@@ -32,10 +32,10 @@
"finance": { "zoneName": "finance", "resources": [ { "database": [
"finance" ] } ] },
"shipping": { "zoneName": "shipping", "resources": [ { "database": [
"shipping" ] } ] }
},
- "gdsInfoFilename": "/policyengine/gds/gds_info_hive.json",
+ "gdsInfoFilename": "/plugin/hive_gds_info.json",
"tests": [
{
- "name": "table: sales.prospects, user: ds-user, access: select",
+ "name": "table: sales.prospects, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table":
"prospects" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -43,7 +43,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 2001 }
},
{
- "name": "table: sales.orders, user: ds-user, access: select",
+ "name": "table: sales.orders, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table": "orders" }
},
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -51,7 +51,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 2001 }
},
{
- "name": "table: finance.invoices, user: ds-user, access: select",
+ "name": "table: finance.invoices, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"invoices" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -59,7 +59,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": true, "isAudited": true, "policyId": 2001 }
},
{
- "name": "table: finance.payments, user: ds-user, access: select",
+ "name": "table: finance.payments, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"payments" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -67,7 +67,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": true, "isAudited": true, "policyId": 2001 }
},
{
- "name": "table: shipping.shipments, user: ds-user, access: select",
+ "name": "table: shipping.shipments, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "shipping", "table":
"shipments" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -75,7 +75,7 @@
"result": { "datasets": [ "dataset-2" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 2002 }
},
{
- "name": "table: customers.contact_info, user: ds-user, access: select",
+ "name": "table: customers.contact_info, user: ds-user, access:
select",
"request": {
"resource": { "elements": { "database": "customers", "table":
"contact_info" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -83,7 +83,7 @@
"result": { "datasets": [ "dataset-3" ], "projects": [ "project-2" ],
"isAllowed": true, "isAudited": true, "policyId": 2003 }
},
{
- "name": "table: operations.facilities, user: ds-user, access: select",
+ "name": "table: operations.facilities, user: ds-user, access: select",
"request": {
"resource": { "elements": { "database": "operations", "table":
"facilities" } },
"accessType": "select", "user": "ds-user", "userGroups": []
@@ -93,7 +93,7 @@
{
- "name": "table: sales.prospects, user: proj-user, access: select",
+ "name": "table: sales.prospects, user: proj-user, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table":
"prospects" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -101,7 +101,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 3001 }
},
{
- "name": "table: sales.orders, user: proj-user, access: select",
+ "name": "table: sales.orders, user: proj-user, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table": "orders" }
},
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -109,7 +109,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 3001 }
},
{
- "name": "table: finance.invoices, user: proj-user, access: select",
+ "name": "table: finance.invoices, user: proj-user, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"invoices" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -117,7 +117,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": true, "isAudited": true, "policyId": 3001 }
},
{
- "name": "table: finance.payments, user: proj-user, access: select",
+ "name": "table: finance.payments, user: proj-user, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"payments" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -125,7 +125,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": true, "isAudited": true, "policyId": 3001 }
},
{
- "name": "table: shipping.shipments, user: proj-user, access: select",
+ "name": "table: shipping.shipments, user: proj-user, access: select",
"request": {
"resource": { "elements": { "database": "shipping", "table":
"shipments" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -133,7 +133,7 @@
"result": { "datasets": [ "dataset-2" ], "projects": [ "project-1" ],
"isAllowed": true, "isAudited": true, "policyId": 3001 }
},
{
- "name": "table: customers.contact_info, user: proj-user, access: select",
+ "name": "table: customers.contact_info, user: proj-user, access:
select",
"request": {
"resource": { "elements": { "database": "customers", "table":
"contact_info" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -141,7 +141,7 @@
"result": { "datasets": [ "dataset-3" ], "projects": [ "project-2" ],
"isAllowed": true, "isAudited": true, "policyId": 3002 }
},
{
- "name": "table: operations.facilities, user: proj-user, access: select",
+ "name": "table: operations.facilities, user: proj-user, access:
select",
"request": {
"resource": { "elements": { "database": "operations", "table":
"facilities" } },
"accessType": "select", "user": "proj-user", "userGroups": []
@@ -151,7 +151,7 @@
{
- "name": "table: sales.prospects, user: scott, access: select",
+ "name": "table: sales.prospects, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table":
"prospects" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -159,7 +159,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: sales.orders, user: scott, access: select",
+ "name": "table: sales.orders, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "sales", "table": "orders" }
},
"accessType": "select", "user": "scott", "userGroups": []
@@ -167,7 +167,7 @@
"result": { "datasets": [ "dataset-1" ], "projects": [ "project-1" ],
"isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: finance.invoices, user: scott, access: select",
+ "name": "table: finance.invoices, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"invoices" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -175,7 +175,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: finance.payments, user: scott, access: select",
+ "name": "table: finance.payments, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "finance", "table":
"payments" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -183,7 +183,7 @@
"result": { "datasets": [ "dataset-1", "dataset-2" ], "projects": [
"project-1" ], "isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: shipping.shipments, user: scott, access: select",
+ "name": "table: shipping.shipments, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "shipping", "table":
"shipments" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -191,7 +191,7 @@
"result": { "datasets": [ "dataset-2" ], "projects": [ "project-1" ],
"isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: customers.contact_info, user: scott, access: select",
+ "name": "table: customers.contact_info, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "customers", "table":
"contact_info" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -199,7 +199,7 @@
"result": { "datasets": [ "dataset-3" ], "projects": [ "project-2" ],
"isAllowed": false, "isAudited": true, "policyId": -1 }
},
{
- "name": "table: operations.facilities, user: scott, access: select",
+ "name": "table: operations.facilities, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "operations", "table":
"facilities" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -209,7 +209,7 @@
{
- "name": "table: operations.facilities, user: scott, access: select",
+ "name": "table: operations.facilities, user: scott, access: select",
"request": {
"resource": { "elements": { "database": "operations", "table":
"facilities" } },
"accessType": "select", "user": "scott", "userGroups": []
@@ -218,7 +218,7 @@
},
{
- "name": "table: operations.facilities, user: ds-user, access: update",
+ "name": "table: operations.facilities, user: ds-user, access: update",
"request": {
"resource": { "elements": { "database": "operations", "table":
"facilities" } },
"accessType": "update", "user": "ds-user", "userGroups": []
@@ -227,128 +227,269 @@
},
{
- "name": "ACLs: database: sales",
+ "name": "ACLs: database: sales",
"request": { "resource": { "elements": { "database": "sales" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: table: sales.prospects",
+ "name": "ACLs: table: sales.prospects",
"request": { "resource": { "elements": { "database": "sales", "table":
"prospects" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds1-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-1" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: table: sales.orders",
+ "name": "ACLs: table: sales.orders",
"request": { "resource": { "elements": { "database": "sales", "table":
"orders" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds1-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-1" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: table: sales.non_existent_table",
+ "name": "ACLs: table: sales.non_existent_table",
"request": { "resource": { "elements": { "database": "sales", "table":
"non_existent_table" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: column: sales.orders.created_time",
+ "name": "ACLs: column: sales.orders.created_time",
"request": { "resource": { "elements": { "database": "sales", "table":
"orders", "column": "created_time" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds1-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-1" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: database: finance",
+ "name": "ACLs: database: finance",
"request": { "resource": { "elements": { "database": "finance" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: table: finance.invoices",
+ "name": "ACLs: table: finance.invoices",
"request": { "resource": { "elements": { "database": "finance", "table":
"invoices" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds1-user": { "select": { "result": 1, "isFinal": true } },
+ "ds2-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-1", "dataset-2" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: table: finance.payments",
+ "name": "ACLs: table: finance.payments",
"request": { "resource": { "elements": { "database": "finance", "table":
"payments" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds1-user": { "select": { "result": 1, "isFinal": true } },
+ "ds2-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-1", "dataset-2" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: database: shipping",
+ "name": "ACLs: database: shipping",
"request": { "resource": { "elements": { "database": "shipping" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: table: shipping.shipments",
+ "name": "ACLs: table: shipping.shipments",
"request": { "resource": { "elements": { "database": "shipping",
"table": "shipments" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds2-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj1-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-2" ],
"projects": [ "project-1" ]
}
},
{
- "name": "ACLs: database: customers",
+ "name": "ACLs: database: customers",
"request": { "resource": { "elements": { "database": "customers" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: table: customers.contact_info",
+ "name": "ACLs: table: customers.contact_info",
"request": { "resource": { "elements": { "database": "customers",
"table": "contact_info" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } },
- "proj-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds3-user": { "select": { "result": 1, "isFinal": true } },
+ "proj-user": { "select": { "result": 1, "isFinal": true } },
+ "proj2-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-3" ],
"projects": [ "project-2" ]
}
},
{
- "name": "ACLs: database: operations",
+ "name": "ACLs: database: operations",
"request": { "resource": { "elements": { "database": "operations" } } },
- "acls": { }
+ "acls": { }
},
{
- "name": "ACLs: table: operations.facilities",
+ "name": "ACLs: table: operations.facilities",
"request": { "resource": { "elements": { "database": "operations",
"table": "facilities" } } },
"acls": {
"userACLs": {
- "ds-user": { "select": { "result": 1, "isFinal": true } }
+ "ds-user": { "select": { "result": 1, "isFinal": true } },
+ "ds4-user": { "select": { "result": 1, "isFinal": true } }
},
"datasets": [ "dataset-4" ]
}
+ },
+
+ {
+ "name": "Datasets for principals: users[ ds-user ]",
+ "principals": { "users": [ "ds-user" ] },
+ "datasets": [ "dataset-1", "dataset-2", "dataset-3", "dataset-4" ]
+ },
+ {
+ "name": "Datasets for principals: users[ ds1-user ]",
+ "principals": { "users": [ "ds1-user" ] },
+ "datasets": [ "dataset-1" ]
+ },
+ {
+ "name": "Datasets for principals: users[ ds2-user ]",
+ "principals": { "users": [ "ds2-user" ] },
+ "datasets": [ "dataset-2" ]
+ },
+ {
+ "name": "Datasets for principals: users[ ds3-user ]",
+ "principals": { "users": [ "ds3-user" ] },
+ "datasets": [ "dataset-3" ]
+ },
+ {
+ "name": "Datasets for principals: users[ ds4-user ]",
+ "principals": { "users": [ "ds4-user" ] },
+ "datasets": [ "dataset-4" ]
+ },
+ {
+ "name": "Datasets for principals: users[ ds1-user, ds4-user ]",
+ "principals": { "users": [ "ds1-user","ds4-user" ] },
+ "datasets": [ "dataset-1", "dataset-4" ]
+ },
+ {
+ "name": "Projects for principals: users=[ proj-user ]",
+ "principals:": { "users": [ "proj-user" ] },
+ "projects": [ "project-1", "project-2" ]
+ },
+ {
+ "name": "Projects for principals: users[ proj1-user ]",
+ "principals": { "users": [ "proj1-user" ] },
+ "projects": [ "project-1" ]
+ },
+ {
+ "name": "Projects for principals: users[ proj2-user ]",
+ "principals": { "users": [ "proj2-user" ] },
+ "projects": [ "project-2" ]
+ },
+ {
+ "name": "Projects for principals: users[ proj1-user, proj2-user ]",
+ "principals": { "users": [ "proj1-user", "proj2-user" ] },
+ "projects": [ "project-1", "project-2" ]
+ },
+
+ {
+ "name": "Resources for Dataset: id=1",
+ "datasetId": 1,
+ "resourceIds": [ 11, 12, 21, 22 ]
+ },
+ {
+ "name": "Resources for Dataset: id=2",
+ "datasetId": 2,
+ "resourceIds": [ 21, 22, 31 ]
+ },
+ {
+ "name": "Resources for Dataset: id=3",
+ "datasetId": 3,
+ "resourceIds": [ 41 ]
+ },
+ {
+ "name": "Resources for Dataset: id=4",
+ "datasetId": 4,
+ "resourceIds": [ 51 ]
+ },
+ {
+ "name": "Resources for Dataset: id=1234 (non_existent_dataset)",
+ "datasetId": 1234,
+ "resourceIds": [ ]
+ },
+
+ {
+ "name": "Resources for Project: id=1",
+ "projectId": 1,
+ "resourceIds": [ 11, 12, 21, 22, 31 ]
+ },
+ {
+ "name": "Resources for Project: id=2",
+ "projectId": 2,
+ "resourceIds": [ 41 ]
+ },
+ {
+ "name": "Resources for Project: id=1234 (non_existent_project)",
+ "projectId": 1234,
+ "resourceIds": [ ]
+ },
+
+ {
+ "name": "Resources for DataShare: id=1",
+ "dataShareId": 1,
+ "resourceIds": [ 11, 12 ]
+ },
+ {
+ "name": "Resources for DataShare: id=2",
+ "dataShareId": 2,
+ "resourceIds": [ 21, 22 ]
+ },
+ {
+ "name": "Resources for DataShare: id=3",
+ "dataShareId": 3,
+ "resourceIds": [ 31 ]
+ },
+ {
+ "name": "Resources for DataShare: id=4",
+ "dataShareId": 4,
+ "resourceIds": [ 41 ]
+ },
+ {
+ "name": "Resources for DataShare: id=5",
+ "dataShareId": 5,
+ "resourceIds": [ 51 ]
+ },
+ {
+ "name": "Resources for DataShare: id=1234
(non_existent_data_share)",
+ "dataShareId": 1234,
+ "resourceIds": [ ]
}
]
}