This is an automated email from the ASF dual-hosted git repository.
rmani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new acbaa5c RANGER-2367:Hive show grants when Ranger is authorizer should
show permission details from Ranger
acbaa5c is described below
commit acbaa5c8800917a682ae756b16939c57cfbae948
Author: rmani <[email protected]>
AuthorDate: Wed Mar 20 17:54:39 2019 -0700
RANGER-2367:Hive show grants when Ranger is authorizer should show
permission details from Ranger
Signed-off-by: rmani <[email protected]>
---
.../policyengine/RangerPolicyEngineImpl.java | 6 +-
.../plugin/policyengine/RangerResourceACLs.java | 34 +-
.../hive/authorizer/RangerHiveAuthorizer.java | 353 ++++++++++++++++-----
.../services/hive/HIVERangerAuthorizerTest.java | 2 +-
.../RangerSampleProjectProvider.java | 2 +-
5 files changed, 312 insertions(+), 85 deletions(-)
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
index 5e68363..9fe0531 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java
@@ -628,7 +628,8 @@ public class RangerPolicyEngineImpl implements
RangerPolicyEngine {
accessResult = RangerPolicyEvaluator.ACCESS_DENIED;
}
}
-
ret.setUserAccessInfo(userName, accessInfo.getKey(), accessResult);
+ RangerPolicy policy =
evaluator.getPolicy();
+
ret.setUserAccessInfo(userName, accessInfo.getKey(), accessResult, policy);
}
}
@@ -644,7 +645,8 @@ public class RangerPolicyEngineImpl implements
RangerPolicyEngine {
accessResult = RangerPolicyEvaluator.ACCESS_DENIED;
}
}
-
ret.setGroupAccessInfo(groupName, accessInfo.getKey(), accessResult);
+ RangerPolicy policy =
evaluator.getPolicy();
+
ret.setGroupAccessInfo(groupName, accessInfo.getKey(), accessResult, policy);
}
}
}
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceACLs.java
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceACLs.java
index adee37e..eafbde2 100644
---
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceACLs.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerResourceACLs.java
@@ -20,6 +20,8 @@
package org.apache.ranger.plugin.policyengine;
import org.apache.commons.lang.StringUtils;
+import org.apache.ranger.plugin.model.RangerPolicy;
+
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -38,7 +40,6 @@ import static
org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator.ACC
public class RangerResourceACLs {
final private Map<String, Map<String, AccessResult>> userACLs = new
HashMap<>();
final private Map<String, Map<String, AccessResult>> groupACLs = new
HashMap<>();
-
public RangerResourceACLs() {
}
@@ -84,7 +85,7 @@ public class RangerResourceACLs {
finalizeAcls(groupACLs);
}
- public void setUserAccessInfo(String userName, String accessType,
Integer access) {
+ public void setUserAccessInfo(String userName, String accessType,
Integer access, RangerPolicy policy) {
Map<String, AccessResult> userAccessInfo =
userACLs.get(userName);
if (userAccessInfo == null) {
@@ -96,15 +97,16 @@ public class RangerResourceACLs {
AccessResult accessResult = userAccessInfo.get(accessType);
if (accessResult == null) {
- accessResult = new AccessResult(access);
+ accessResult = new AccessResult(access, policy);
userAccessInfo.put(accessType, accessResult);
} else {
accessResult.setResult(access);
+ accessResult.setPolicy(policy);
}
}
- public void setGroupAccessInfo(String groupName, String accessType,
Integer access) {
+ public void setGroupAccessInfo(String groupName, String accessType,
Integer access, RangerPolicy policy) {
Map<String, AccessResult> groupAccessInfo =
groupACLs.get(groupName);
if (groupAccessInfo == null) {
@@ -116,11 +118,12 @@ public class RangerResourceACLs {
AccessResult accessResult = groupAccessInfo.get(accessType);
if (accessResult == null) {
- accessResult = new AccessResult(access);
+ accessResult = new AccessResult(access, policy);
groupAccessInfo.put(accessType, accessResult);
} else {
accessResult.setResult(access);
+ accessResult.setPolicy(policy);
}
}
@@ -135,6 +138,7 @@ public class RangerResourceACLs {
sb.append("permissions={");
for (Map.Entry<String, AccessResult> permission :
entry.getValue().entrySet()) {
sb.append("{Permission=").append(permission.getKey()).append(",
value=").append(permission.getValue()).append("},");
+
sb.append("{RangerPolicyID=").append(permission.getValue().getPolicy().getId()).append("},");
}
sb.append("},");
}
@@ -145,6 +149,7 @@ public class RangerResourceACLs {
sb.append("permissions={");
for (Map.Entry<String, AccessResult> permission :
entry.getValue().entrySet()) {
sb.append("{Permission=").append(permission.getKey()).append(",
value=").append(permission.getValue()).append("}, ");
+ sb.append("{RangerPolicy
ID=").append(permission.getValue().getPolicy().getId()).append("},");
}
sb.append("},");
}
@@ -179,19 +184,20 @@ public class RangerResourceACLs {
public static class AccessResult {
private int result;
private boolean isFinal;
-
+ private RangerPolicy policy;
public AccessResult() {
- this(-1);
+ this(-1, null);
}
- public AccessResult(int result) {
- this(result, false);
+ public AccessResult(int result, RangerPolicy policy) {
+ this(result, false, policy);
}
- public AccessResult(int result, boolean isFinal) {
+ public AccessResult(int result, boolean isFinal, RangerPolicy
policy) {
setIsFinal(isFinal);
setResult(result);
+ setPolicy(policy);
}
public int getResult() { return result; }
@@ -210,6 +216,14 @@ public class RangerResourceACLs {
public void setIsFinal(boolean isFinal) { this.isFinal =
isFinal; }
+ public RangerPolicy getPolicy() {
+ return policy;
+ }
+
+ public void setPolicy(RangerPolicy policy){
+ this.policy = policy;
+ }
+
@Override
public boolean equals(Object other) {
if (other == null)
diff --git
a/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
b/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
index 0f3bee5..be82639 100644
---
a/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
+++
b/hive-agent/src/main/java/org/apache/ranger/authorization/hive/authorizer/RangerHiveAuthorizer.java
@@ -29,6 +29,7 @@ import java.util.Map;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -38,11 +39,7 @@ import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.hive.common.FileUtils;
import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.metastore.IMetaStoreClient;
-import org.apache.hadoop.hive.metastore.api.HiveObjectPrivilege;
import org.apache.hadoop.hive.metastore.api.HiveObjectRef;
-import org.apache.hadoop.hive.metastore.api.PrincipalType;
-import org.apache.hadoop.hive.metastore.api.PrivilegeGrantInfo;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider;
@@ -59,6 +56,7 @@ import
org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeInfo
import
org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeObject;
import
org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeObject.HivePrivObjectActionType;
import
org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeObject.HivePrivilegeObjectType;
+import
org.apache.hadoop.hive.ql.security.authorization.plugin.HiveResourceACLs;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
@@ -67,7 +65,12 @@ import org.apache.ranger.authorization.utils.StringUtil;
import org.apache.ranger.plugin.model.RangerPolicy;
import org.apache.ranger.plugin.model.RangerServiceDef.RangerDataMaskTypeDef;
import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
+import org.apache.ranger.plugin.policyengine.RangerAccessRequestImpl;
import org.apache.ranger.plugin.policyengine.RangerAccessResult;
+import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
+import org.apache.ranger.plugin.policyengine.RangerResourceACLs;
+import org.apache.ranger.plugin.policyevaluator.RangerPolicyEvaluator;
+import org.apache.ranger.plugin.service.RangerAuthContext;
import org.apache.ranger.plugin.service.RangerBasePlugin;
import org.apache.ranger.plugin.util.GrantRevokeRequest;
import org.apache.ranger.plugin.util.RangerAccessRequestUtil;
@@ -86,8 +89,12 @@ public class RangerHiveAuthorizer extends
RangerHiveAuthorizerBase {
private static final String HIVE_CONF_VAR_QUERY_STRING =
"hive.query.string";
+ private static final String DEFAULT_RANGER_POLICY_GRANTOR = "ranger";
+
private static volatile RangerHivePlugin hivePlugin = null;
+ private static RangerAuthContext authContext;
+
public RangerHiveAuthorizer(HiveMetastoreClientFactory
metastoreClientFactory,
HiveConf
hiveConf,
HiveAuthenticationProvider hiveAuthenticator,
@@ -771,7 +778,7 @@ public class RangerHiveAuthorizer extends
RangerHiveAuthorizerBase {
return ret;
}
- RangerHiveResource createHiveResource(HivePrivilegeObject
privilegeObject) {
+ private RangerHiveResource createHiveResource(HivePrivilegeObject
privilegeObject) {
RangerHiveResource resource = null;
HivePrivilegeObjectType objectType = privilegeObject.getType();
@@ -1475,82 +1482,37 @@ public class RangerHiveAuthorizer extends
RangerHiveAuthorizerBase {
@Override
public List<HivePrivilegeInfo> showPrivileges(HivePrincipal principal,
- HivePrivilegeObject privObj) throws
HiveAuthzPluginException {
- try {
+
HivePrivilegeObject privObj) throws HiveAuthzPluginException {
+ List<HivePrivilegeInfo> ret;
- LOG.debug("RangerHiveAuthorizer.showPrivileges()");
- IMetaStoreClient mClient = getMetastoreClientFactory()
- .getHiveMetastoreClient();
- List<HivePrivilegeInfo> resPrivInfos = new
ArrayList<HivePrivilegeInfo>();
- String principalName = null;
- PrincipalType principalType = null;
- if (principal != null) {
- principalName = principal.getName();
- principalType = AuthorizationUtils
-
.getThriftPrincipalType(principal.getType());
- }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==> RangerHiveAuthorizer.showPrivileges ==>
principal: " + principal+ "HivePrivilegeObject : " + privObj.getObjectName());
+ }
- List<HiveObjectPrivilege> msObjPrivs =
mClient.list_privileges(
- principalName, principalType,
- this.getThriftHiveObjectRef(privObj));
- if (msObjPrivs != null) {
- for (HiveObjectPrivilege msObjPriv :
msObjPrivs) {
- HiveObjectRef msObjRef =
msObjPriv.getHiveObject();
-
org.apache.hadoop.hive.metastore.api.HiveObjectType objectType = msObjRef
- .getObjectType();
- if (!isSupportedObjectType(objectType))
{
- continue;
- }
- HivePrincipal resPrincipal = new
HivePrincipal(
-
msObjPriv.getPrincipalName(),
-
AuthorizationUtils.getHivePrincipalType(msObjPriv
-
.getPrincipalType()));
-
- PrivilegeGrantInfo msGrantInfo =
msObjPriv.getGrantInfo();
- HivePrivilege resPrivilege = new
HivePrivilege(
-
msGrantInfo.getPrivilege(), null);
-
- HivePrivilegeObject resPrivObj = new
HivePrivilegeObject(
-
getPluginPrivilegeObjType(objectType),
- msObjRef.getDbName(),
msObjRef.getObjectName(),
-
msObjRef.getPartValues(), msObjRef.getColumnName());
-
- HivePrincipal grantorPrincipal = new
HivePrincipal(
-
msGrantInfo.getGrantor(),
-
AuthorizationUtils.getHivePrincipalType(msGrantInfo
-
.getGrantorType()));
-
- HivePrivilegeInfo resPrivInfo = new
HivePrivilegeInfo(
- resPrincipal,
resPrivilege, resPrivObj,
- grantorPrincipal,
msGrantInfo.isGrantOption(),
-
msGrantInfo.getCreateTime());
- resPrivInfos.add(resPrivInfo);
- }
+ if ( hivePlugin == null) {
+ new
HiveAuthzPluginException("RangerHiveAuthorizer.showPrivileges error: hivePlugin
is null");
+ }
- } else {
- throw new HiveAccessControlException(
-
"RangerHiveAuthorizer.showPrivileges():User has to specify"
- + " a user name
or role in the show grant. ");
+ try {
+ authContext =
hivePlugin.createRangerAuthContext();
+ HiveObjectRef msObjRef =
AuthorizationUtils.getThriftHiveObjectRef(privObj);
+
+ if (msObjRef.getObjectName() == null) {
+ throw new
HiveAuthzPluginException("RangerHiveAuthorizer.showPrivileges() only supports
SHOW PRIVILEGES for Hive resources and not user level");
}
- return resPrivInfos;
+
+ ret = getHivePrivilegeInfos(principal, privObj);
} catch (Exception e) {
- LOG.error("RangerHiveAuthorizer.showPrivileges:
showPrivileges returned by showPrivileges is null");
- throw new HiveAuthzPluginException("hive
showPrivileges" + ": "
- + e.getMessage(), e);
+ LOG.error("RangerHiveAuthorizer.showPrivileges()
error", e);
+ throw new
HiveAuthzPluginException("RangerHiveAuthorizer.showPrivileges() error: " +
e.getMessage(), e);
}
- }
- private boolean isSupportedObjectType(
- org.apache.hadoop.hive.metastore.api.HiveObjectType
objectType) {
- switch (objectType) {
- case DATABASE:
- case TABLE:
- return true;
- default:
- return false;
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<== RangerHiveAuthorizer.showPrivileges()
Result: " + ret);
}
+ return ret;
}
private HivePrivilegeObjectType getPluginPrivilegeObjType(
@@ -1640,6 +1602,255 @@ public class RangerHiveAuthorizer extends
RangerHiveAuthorizerBase {
return ret;
}
+ private List<HivePrivilegeInfo> getHivePrivilegeInfos(HivePrincipal
principal, HivePrivilegeObject privObj) throws HiveAuthzPluginException {
+ List<HivePrivilegeInfo> ret = new ArrayList<>();
+ HivePrivilegeObject.HivePrivilegeObjectType objectType = null;
+ Map<String, Map<HiveResourceACLs.Privilege,
HiveResourceACLs.AccessResult>> userPermissions = null;
+ Map<String, Map<HiveResourceACLs.Privilege,
HiveResourceACLs.AccessResult>> groupPermissions = null;
+
+ String dbName = null;
+ String objectName = null;
+ String columnName = null;
+ List<String> partValues = null;
+
+ try {
+ HiveObjectRef msObjRef =
AuthorizationUtils.getThriftHiveObjectRef(privObj);
+
+ if (msObjRef != null) {
+ HivePrivilegeObject hivePrivilegeObject = null;
+
+ if (msObjRef.getObjectName() != null) {
+ // when resource is specified in the
show grants, acl will be for that resource / user / groups
+ objectType =
getPluginPrivilegeObjType(msObjRef.getObjectType());
+ dbName = msObjRef.getDbName();
+ objectName = msObjRef.getObjectName();
+ columnName = (msObjRef.getColumnName()
== null) ? new String() : msObjRef.getColumnName();
+ partValues = (msObjRef.getPartValues()
== null) ? new ArrayList<>() : msObjRef.getPartValues();
+ hivePrivilegeObject = new
HivePrivilegeObject(objectType, dbName, objectName);
+
+ RangerResourceACLs rangerResourceACLs =
getRangerResourceACLs(hivePrivilegeObject);
+
+ if (rangerResourceACLs != null) {
+ Map<String, Map<String,
RangerResourceACLs.AccessResult>> userRangerACLs =
rangerResourceACLs.getUserACLs();
+ Map<String, Map<String,
RangerResourceACLs.AccessResult>> groupRangerACLs =
rangerResourceACLs.getGroupACLs();
+ userPermissions =
convertRangerACLsToHiveACLs(userRangerACLs);
+ groupPermissions =
convertRangerACLsToHiveACLs(groupRangerACLs);
+
+ if (principal != null) {
+ String user =
principal.getName();
+
Map<HiveResourceACLs.Privilege, HiveResourceACLs.AccessResult> userACLs =
userPermissions.get(user);
+ if (userACLs != null) {
+ Map<String,
RangerResourceACLs.AccessResult> userAccessResult = userRangerACLs.get(user);
+ for
(HiveResourceACLs.Privilege userACL : userACLs.keySet()) {
+
RangerPolicy policy = getRangerPolicy(userAccessResult, userACL.name());
+ if
(policy != null) {
+
String aclname = getPermission(userACL, userAccessResult, policy);
+
HivePrivilegeInfo privilegeInfo = createHivePrivilegeInfo(principal,
objectType, dbName, objectName, columnName, partValues, aclname, policy);
+
ret.add(privilegeInfo);
+ }
+ }
+ }
+
+ Set<String> groups =
getPrincipalGroup(user);
+ for(String group :
groups) {
+
Map<HiveResourceACLs.Privilege, HiveResourceACLs.AccessResult> groupACLs =
groupPermissions.get(group);
+ if (groupACLs
!= null) {
+
Map<String, RangerResourceACLs.AccessResult> groupAccessResult =
groupRangerACLs.get(group);
+ for
(HiveResourceACLs.Privilege groupACL : groupACLs.keySet()) {
+
RangerPolicy policy = getRangerPolicy(groupAccessResult, groupACL.name());
+
if (policy != null) {
+
String aclname = getPermission(groupACL, groupAccessResult, policy);
+
HivePrivilegeInfo privilegeInfo = createHivePrivilegeInfo(principal,
objectType, dbName, objectName, columnName, partValues, aclname, policy);
+
ret.add(privilegeInfo);
+
}
+ }
+ }
+ }
+ } else {
+ // Request is for all
the ACLs on a resource
+ for (String user :
userRangerACLs.keySet()) {
+ HivePrincipal
hivePrincipal = new HivePrincipal(user, HivePrincipal.HivePrincipalType.USER);
+
Map<HiveResourceACLs.Privilege, HiveResourceACLs.AccessResult> userACLs =
userPermissions.get(user);
+
+ if (userACLs !=
null) {
+
Map<String, RangerResourceACLs.AccessResult> userAccessResult =
userRangerACLs.get(user);
+ for
(HiveResourceACLs.Privilege userACL : userACLs.keySet()) {
+
RangerPolicy policy = getRangerPolicy(userAccessResult, userACL.name());
+
if (policy != null) {
+
String aclname = getPermission(userACL, userAccessResult, policy);
+
HivePrivilegeInfo privilegeInfo =
createHivePrivilegeInfo(hivePrincipal, objectType, dbName, objectName,
columnName, partValues, aclname, policy);
+
ret.add(privilegeInfo);
+
}
+ }
+ }
+ }
+
+ for (String group :
groupRangerACLs.keySet()) {
+ HivePrincipal
hivePrincipal = new HivePrincipal(group, HivePrincipal.HivePrincipalType.GROUP);
+
Map<HiveResourceACLs.Privilege, HiveResourceACLs.AccessResult> groupACLs =
groupPermissions.get(group);
+ if (groupACLs
!= null) {
+
Map<String, RangerResourceACLs.AccessResult> groupAccessResult =
groupRangerACLs.get(group);
+ for
(HiveResourceACLs.Privilege groupACL : groupACLs.keySet()) {
+
RangerPolicy policy = getRangerPolicy(groupAccessResult, groupACL.name());
+
if (policy != null) {
+
String aclname = getPermission(groupACL, groupAccessResult, policy);
+
HivePrivilegeInfo privilegeInfo =
createHivePrivilegeInfo(hivePrincipal, objectType, dbName, objectName,
columnName, partValues, aclname, policy);
+
ret.add(privilegeInfo);
+
}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new HiveAuthzPluginException("hive
showPrivileges" + ": " + e.getMessage(), e);
+ }
+ return ret;
+ }
+
+ private RangerPolicy getRangerPolicy(Map<String,
RangerResourceACLs.AccessResult> accessResults, String rangerACL){
+ RangerPolicy ret = null;
+ if (MapUtils.isNotEmpty(accessResults)) {
+ RangerResourceACLs.AccessResult accessResult =
accessResults.get(rangerACL.toLowerCase());
+ if (accessResult != null) {
+ ret = accessResult.getPolicy();
+ }
+ }
+ return ret;
+ }
+
+ private HivePrivilegeInfo createHivePrivilegeInfo(HivePrincipal
hivePrincipal,
+
HivePrivilegeObject.HivePrivilegeObjectType
objectType,
+
String dbName,
+
String objectName,
+
String columnName,
+
List<String> partValues,
+
String aclName,
+
RangerPolicy policy) {
+ HivePrivilegeInfo ret = null;
+ int creationDate = 0;
+ boolean delegateAdmin = false;
+
+ for (RangerPolicy.RangerPolicyItem policyItem :
policy.getPolicyItems()) {
+ List<RangerPolicy.RangerPolicyItemAccess>
policyItemAccesses = policyItem.getAccesses();
+ List<String> users = policyItem.getUsers();
+ List<String> groups = policyItem.getGroups();
+ List<String> accessTypes = new ArrayList<>();
+
+ for (RangerPolicy.RangerPolicyItemAccess
policyItemAccess : policyItemAccesses) {
+ accessTypes.add(policyItemAccess.getType());
+ }
+
+ if (accessTypes.contains(aclName.toLowerCase()) &&
(users.contains(hivePrincipal.getName())
+ ||
groups.contains(hivePrincipal.getName()))) {
+ creationDate = (policy.getCreateTime() == null)
? creationDate : (int) (policy.getCreateTime().getTime()/1000);
+ delegateAdmin = (policyItem.getDelegateAdmin()
== null) ? delegateAdmin : policyItem.getDelegateAdmin().booleanValue();
+ }
+ }
+
+ HivePrincipal grantorPrincipal = new
HivePrincipal(DEFAULT_RANGER_POLICY_GRANTOR,
HivePrincipal.HivePrincipalType.USER);
+ HivePrivilegeObject privilegeObject = new
HivePrivilegeObject(objectType, dbName, objectName, partValues, columnName);
+ HivePrivilege privilege = new HivePrivilege(aclName, null);
+ ret = new HivePrivilegeInfo(hivePrincipal, privilege,
privilegeObject, grantorPrincipal, delegateAdmin, creationDate);
+
+ return ret;
+ }
+
+ private Set<String> getPrincipalGroup(String user) {
+ Set<String> groups = null;
+ UserGroupInformation ugi =
UserGroupInformation.createRemoteUser(user);
+ groups = Sets.newHashSet(ugi.getGroupNames());
+ return groups;
+ }
+
+ private RangerResourceACLs getRangerResourceACLs(HivePrivilegeObject
hiveObject) {
+
+ RangerResourceACLs ret = null;
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==>
RangerHivePolicyProvider.getRangerResourceACLs:[" + hiveObject + "]");
+ }
+
+ RangerHiveResource hiveResource =
createHiveResource(hiveObject);
+ RangerAccessRequestImpl request = new
RangerAccessRequestImpl(hiveResource, RangerPolicyEngine.ANY_ACCESS, null,
null);
+
+ ret = authContext.getResourceACLs(request);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<==
RangerHivePolicyProvider.getRangerResourceACLs:[" + hiveObject + "], Computed
ACLS:[" + ret + "]");
+ }
+
+ return ret;
+ }
+
+ private Map<String, Map<HiveResourceACLs.Privilege,
HiveResourceACLs.AccessResult>> convertRangerACLsToHiveACLs(Map<String,
Map<String, RangerResourceACLs.AccessResult>> rangerACLs) {
+
+ Map<String, Map<HiveResourceACLs.Privilege,
HiveResourceACLs.AccessResult>> ret = new HashMap<>();
+
+ if (MapUtils.isNotEmpty(rangerACLs)) {
+ Set<String> hivePrivileges = new HashSet<>();
+ for (HiveResourceACLs.Privilege privilege :
HiveResourceACLs.Privilege.values()) {
+
hivePrivileges.add(privilege.name().toLowerCase());
+ }
+
+ for (Map.Entry<String, Map<String,
RangerResourceACLs.AccessResult>> entry : rangerACLs.entrySet()) {
+
+ Map<HiveResourceACLs.Privilege,
HiveResourceACLs.AccessResult> permissions = new HashMap<>();
+ ret.put(entry.getKey(), permissions);
+
+ for (Map.Entry<String,
RangerResourceACLs.AccessResult> permission : entry.getValue().entrySet()) {
+
+ if
(hivePrivileges.contains(permission.getKey())) {
+ HiveResourceACLs.Privilege
privilege =
HiveResourceACLs.Privilege.valueOf(StringUtils.upperCase(permission.getKey()));
+ HiveResourceACLs.AccessResult
accessResult;
+ int rangerResultValue =
permission.getValue().getResult();
+
+ if (rangerResultValue ==
RangerPolicyEvaluator.ACCESS_ALLOWED) {
+ accessResult =
HiveResourceACLs.AccessResult.ALLOWED;
+ } else if (rangerResultValue ==
RangerPolicyEvaluator.ACCESS_DENIED) {
+ accessResult =
HiveResourceACLs.AccessResult.NOT_ALLOWED;
+ } else if (rangerResultValue ==
RangerPolicyEvaluator.ACCESS_CONDITIONAL) {
+ accessResult =
HiveResourceACLs.AccessResult.CONDITIONAL_ALLOWED;
+ } else {
+ // Should not get here
+ accessResult =
HiveResourceACLs.AccessResult.NOT_ALLOWED;
+ }
+ permissions.put(privilege,
accessResult);
+ }
+ }
+ }
+ }
+ return ret;
+ }
+
+ private String getPermission(HiveResourceACLs.Privilege acl,
Map<String, RangerResourceACLs.AccessResult> accessResultMap, RangerPolicy
policy ) {
+ String aclname = acl.name();
+ int aclResult = checkACLIsAllowed(acl, accessResultMap);
+ if (aclResult > RangerPolicyEvaluator.ACCESS_DENIED) {
+ // Other than denied ACLs are considered
+ if (policy != null) {
+ if (aclResult ==
RangerPolicyEvaluator.ACCESS_UNDETERMINED) {
+ aclname = aclname + " " +
"(ACCESS_UNDETERMINED)";
+ } else if (aclResult ==
RangerPolicyEvaluator.ACCESS_CONDITIONAL) {
+ aclname = aclname + " " +
"(ACCESS_CONDITIONAL)";
+ }
+ }
+ }
+ return aclname;
+ }
+
+ private int checkACLIsAllowed(HiveResourceACLs.Privilege acl,
Map<String, RangerResourceACLs.AccessResult> accessResultMap ) {
+ int result = -1;
+ String aclName = acl.name().toLowerCase();
+ RangerResourceACLs.AccessResult accessResult =
accessResultMap.get(aclName);
+ if (accessResult != null) {
+ result = accessResult.getResult();
+ }
+ return result;
+ }
+
private String toString(HiveOperationType hiveOpType,
List<HivePrivilegeObject> inputHObjs,
List<HivePrivilegeObject> outputHObjs,
diff --git
a/hive-agent/src/test/java/org/apache/ranger/services/hive/HIVERangerAuthorizerTest.java
b/hive-agent/src/test/java/org/apache/ranger/services/hive/HIVERangerAuthorizerTest.java
index af60479..b04e8bc 100644
---
a/hive-agent/src/test/java/org/apache/ranger/services/hive/HIVERangerAuthorizerTest.java
+++
b/hive-agent/src/test/java/org/apache/ranger/services/hive/HIVERangerAuthorizerTest.java
@@ -940,7 +940,7 @@ public class HIVERangerAuthorizerTest {
String initialUrl = "jdbc:hive2://localhost:" + port;
Connection connection = DriverManager.getConnection(initialUrl,
"admin", "admin");
Statement statement = connection.createStatement();
- Assert.assertTrue(statement.execute("show grant user admin"));
+ Assert.assertTrue(statement.execute("show grant user admin on table
words"));
statement.close();
connection.close();
}
diff --git
a/ranger-examples/conditions-enrichers/src/main/java/org/apache/ranger/plugin/contextenricher/RangerSampleProjectProvider.java
b/ranger-examples/conditions-enrichers/src/main/java/org/apache/ranger/plugin/contextenricher/RangerSampleProjectProvider.java
index df6da7c..be17e83 100644
---
a/ranger-examples/conditions-enrichers/src/main/java/org/apache/ranger/plugin/contextenricher/RangerSampleProjectProvider.java
+++
b/ranger-examples/conditions-enrichers/src/main/java/org/apache/ranger/plugin/contextenricher/RangerSampleProjectProvider.java
@@ -83,7 +83,7 @@ public class RangerSampleProjectProvider extends
RangerAbstractContextEnricher {
LOG.debug("==> RangerSampleProjectProvider.enrich(" +
request + ")");
}
- if(request != null && userProjectMap != null) {
+ if(request != null && userProjectMap != null &&
request.getUser() != null) {
Map<String, Object> context = request.getContext();
String project =
userProjectMap.getProperty(request.getUser());