This is an automated email from the ASF dual-hosted git repository.
maheshbandal15 pushed a commit to branch ranger-2.10
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/ranger-2.10 by this push:
new 8aa696bac RANGER-5797: Improve policy evaluation logic for _any access
type and priority handling (#1273)
8aa696bac is described below
commit 8aa696bacedced2fcfc3f66c3050520d8da870f0
Author: Mahesh Bandal <[email protected]>
AuthorDate: Fri Oct 16 14:27:08 2026 +0530
RANGER-5797: Improve policy evaluation logic for _any access type and
priority handling (#1273)
---
.../RangerDefaultPolicyEvaluator.java | 19 ++--
.../plugin/policyengine/TestPolicyEngine.java | 7 ++
...test_policyengine_hive_any_access_priority.json | 126 +++++++++++++++++++++
3 files changed, 142 insertions(+), 10 deletions(-)
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
index 85cc61ed8..9a11c973a 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerDefaultPolicyEvaluator.java
@@ -861,15 +861,11 @@ protected void evaluatePolicyItems(RangerAccessRequest
request, RangerPolicyReso
}
}
} else { // Earlier evaluator
denied this access
- if (getPolicyPriority()
>= oldPriority && allowResult != null && (oneRequest.isAccessTypeAny() ||
RangerAccessRequestUtil.getIsAnyAccessInContext(oneRequest.getContext()))) {
-
accessTypeResults.put(accessType, allowResult);
- } else {
- if
(getPolicyPriority() > oldPriority) {
- if
(allowResult != null) {
-
accessTypeResults.put(accessType, allowResult);
- } else
if (denyResult != null) {
-
accessTypeResults.put(accessType, denyResult);
- }
+ if (getPolicyPriority()
> oldPriority) {
+ if (allowResult
!= null) {
+
accessTypeResults.put(accessType, allowResult);
+ } else if
(denyResult != null) {
+
accessTypeResults.put(accessType, denyResult);
}
}
}
@@ -879,7 +875,10 @@ protected void evaluatePolicyItems(RangerAccessRequest
request, RangerPolicyReso
*/
if (oneRequest.isAccessTypeAny() ||
RangerAccessRequestUtil.getIsAnyAccessInContext(oneRequest.getContext())) {
if
(oneRequest.ignoreDescendantDeny() && allowResult != null) {
- break;
+ RangerAccessResult
storedResult = accessTypeResults.get(accessType);
+ if (storedResult !=
null && storedResult.getIsAllowed()) {
+ break;
+ }
} else if
(!oneRequest.ignoreDescendantDeny() && denyResult != null) {
break;
}
diff --git
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java
index a47f72bd8..f944472af 100644
---
a/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java
+++
b/agents-common/src/test/java/org/apache/ranger/plugin/policyengine/TestPolicyEngine.java
@@ -228,6 +228,13 @@ public void testPolicyEngine_hive() {
runTestsFromResourceFiles(hiveTestResourceFiles);
}
+ @Test
+ public void testPolicyEngine_hive_any_access_priority() {
+ String[] hiveTestResourceFiles = {
"/policyengine/test_policyengine_hive_any_access_priority.json" };
+
+ runTestsFromResourceFiles(hiveTestResourceFiles);
+ }
+
@Test
public void testPolicyEngine_hive_incremental_add() {
String[] hiveTestResourceFiles =
{"/policyengine/test_policyengine_hive_incremental_add.json"};
diff --git
a/agents-common/src/test/resources/policyengine/test_policyengine_hive_any_access_priority.json
b/agents-common/src/test/resources/policyengine/test_policyengine_hive_any_access_priority.json
new file mode 100644
index 000000000..866e495d4
--- /dev/null
+++
b/agents-common/src/test/resources/policyengine/test_policyengine_hive_any_access_priority.json
@@ -0,0 +1,126 @@
+{
+ "serviceName":"hivedev",
+
+ "serviceDef":{
+ "name":"hive",
+ "id":3,
+ "resources":[
+
{"name":"database","level":1,"mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"Hive Database","description":"Hive Database"},
+
{"name":"url","level":1,"mandatory":true,"lookupSupported":false,"recursiveSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerURLResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"URL","description":"URL"},
+
{"name":"hiveservice","level":1,"mandatory":true,"lookupSupported":false,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"HiveService","description":"HiveService"},
+
{"name":"table","level":2,"parent":"database","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"Hive Table","description":"Hive Table"},
+
{"name":"udf","level":2,"parent":"database","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"Hive UDF","description":"Hive UDF"},
+
{"name":"column","level":3,"parent":"table","mandatory":true,"lookupSupported":true,"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher","matcherOptions":{"wildCard":true,
"ignoreCase":true},"label":"Hive Column","description":"Hive Column"}
+ ],
+ "accessTypes":[
+ {"name":"select","label":"Select"},
+ {"name":"update","label":"Update"},
+ {"name":"create","label":"Create"},
+ {"name":"drop","label":"Drop"},
+ {"name":"alter","label":"Alter"},
+ {"name":"index","label":"Index"},
+ {"name":"lock","label":"Lock"},
+ {"name":"read","label":"Read"},
+ {"name":"write","label":"Write"},
+ {"name":"repladmin","label":"ReplAdmin"},
+ {"name":"serviceadmin","label":"ServiceAdmin"},
+ {"name":"all","label":"All",
+ "impliedGrants": [
+ "select",
+ "update",
+ "create",
+ "drop",
+ "alter",
+ "index",
+ "lock",
+ "read",
+ "write",
+ "repladmin",
+ "serviceadmin"
+ ]
+ }
+ ]
+ },
+
+ "policies":[
+ {"id":101,"name":"case1 deny create/drop/alter for
public","isEnabled":true,"isAuditEnabled":true,"policyPriority":1,
+
"resources":{"database":{"values":["case1_db"]},"table":{"values":["*"]},"column":{"values":["*"]}},
+ "denyPolicyItems":[
+
{"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"alter","isAllowed":true}],"users":[],"groups":["public"],"delegateAdmin":false}
+ ]
+ },
+ {"id":102,"name":"case1 allow select/update/drop/read/write for
hrt15","isEnabled":true,"isAuditEnabled":true,"policyPriority":0,
+
"resources":{"database":{"values":["case1_db"]},"table":{"values":["test1"]},"column":{"values":["*"]}},
+ "policyItems":[
+
{"accesses":[{"type":"select","isAllowed":true},{"type":"update","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"read","isAllowed":true},{"type":"write","isAllowed":true}],"users":["hrt15"],"groups":[],"delegateAdmin":false}
+ ]
+ },
+ {"id":201,"name":"case2 deny create/drop/alter for
public","isEnabled":true,"isAuditEnabled":true,"policyPriority":0,
+
"resources":{"database":{"values":["case2_db"]},"table":{"values":["*"]},"column":{"values":["*"]}},
+ "denyPolicyItems":[
+
{"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"alter","isAllowed":true}],"users":[],"groups":["public"],"delegateAdmin":false}
+ ]
+ },
+ {"id":202,"name":"case2 allow select/update/drop/read/write for
hrt15","isEnabled":true,"isAuditEnabled":true,"policyPriority":0,
+
"resources":{"database":{"values":["case2_db"]},"table":{"values":["test1"]},"column":{"values":["*"]}},
+ "policyItems":[
+
{"accesses":[{"type":"select","isAllowed":true},{"type":"update","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"read","isAllowed":true},{"type":"write","isAllowed":true}],"users":["hrt15"],"groups":[],"delegateAdmin":false}
+ ]
+ },
+ {"id":301,"name":"case3 deny create/drop/alter for
public","isEnabled":true,"isAuditEnabled":true,"policyPriority":1,
+
"resources":{"database":{"values":["case3_db"]},"table":{"values":["*"]},"column":{"values":["*"]}},
+ "denyPolicyItems":[
+
{"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"alter","isAllowed":true}],"users":[],"groups":["public"],"delegateAdmin":false}
+ ]
+ },
+ {"id":302,"name":"case3 allow
select/update/create/alter/index/lock/read/write for
hrt15","isEnabled":true,"isAuditEnabled":true,"policyPriority":0,
+
"resources":{"database":{"values":["case3_db"]},"table":{"values":["test1"]},"column":{"values":["*"]}},
+ "policyItems":[
+
{"accesses":[{"type":"select","isAllowed":true},{"type":"update","isAllowed":true},{"type":"create","isAllowed":true},{"type":"alter","isAllowed":true},{"type":"index","isAllowed":true},{"type":"lock","isAllowed":true},{"type":"read","isAllowed":true},{"type":"write","isAllowed":true}],"users":["hrt15"],"groups":[],"delegateAdmin":false}
+ ]
+ },
+ {"id":401,"name":"case4 deny create/drop/alter for
public","isEnabled":true,"isAuditEnabled":true,"policyPriority":1,
+
"resources":{"database":{"values":["case4_db"]},"table":{"values":["*"]},"column":{"values":["*"]}},
+ "denyPolicyItems":[
+
{"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"alter","isAllowed":true}],"users":[],"groups":["public"],"delegateAdmin":false}
+ ]
+ },
+ {"id":402,"name":"case4 allow create/drop/alter for
hrt15","isEnabled":true,"isAuditEnabled":true,"policyPriority":1,
+
"resources":{"database":{"values":["case4_db"]},"table":{"values":["test1"]},"column":{"values":["*"]}},
+ "policyItems":[
+
{"accesses":[{"type":"create","isAllowed":true},{"type":"drop","isAllowed":true},{"type":"alter","isAllowed":true}],"users":["hrt15"],"groups":[],"delegateAdmin":false}
+ ]
+ }
+ ],
+
+ "tests":[
+ {"name":"CASE-1: higher-priority deny, _any allowed via select",
+ "request":{
+ "resource":{"elements":{"database":"case1_db"}},
+
"accessType":"","user":"hrt15","userGroups":["public"],"requestData":"use
case1_db"
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":102}
+ },
+ {"name":"CASE-2: same-priority deny, deny wins per type, _any allowed via
select",
+ "request":{
+ "resource":{"elements":{"database":"case2_db"}},
+
"accessType":"","user":"hrt15","userGroups":["public"],"requestData":"use
case2_db"
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":202}
+ },
+ {"name":"CASE-3: higher-priority deny, allow policy skips denied types to
find select",
+ "request":{
+ "resource":{"elements":{"database":"case3_db"}},
+
"accessType":"","user":"hrt15","userGroups":["public"],"requestData":"use
case3_db"
+ },
+ "result":{"isAudited":true,"isAllowed":true,"policyId":302}
+ },
+ {"name":"CASE-4: same-priority deny+allow for all allowed types, _any
denied",
+ "request":{
+ "resource":{"elements":{"database":"case4_db"}},
+
"accessType":"","user":"hrt15","userGroups":["public"],"requestData":"use
case4_db"
+ },
+ "result":{"isAudited":true,"isAllowed":false,"policyId":-1}
+ }
+ ]
+}