This is an automated email from the ASF dual-hosted git repository.

mugdha pushed a commit to branch ranger-2.6
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/ranger-2.6 by this push:
     new 19a3e11a3 RANGER-4777: Improve API /public/v2/api/service-headers to 
filter services depending on user role
19a3e11a3 is described below

commit 19a3e11a33fc013da8578f59697a7bc8a5cbe63c
Author: Rakesh Gupta <[email protected]>
AuthorDate: Tue Oct 22 12:18:07 2024 +0530

    RANGER-4777: Improve API /public/v2/api/service-headers to filter services 
depending on user role
    
    Signed-off-by: Mugdha Varadkar <[email protected]>
---
 .../ranger/plugin/model/RangerServiceHeaderInfo.java    | 10 ++++++++++
 .../main/java/org/apache/ranger/biz/RangerBizUtil.java  | 15 +++++++++++++++
 .../apache/ranger/db/XXSecurityZoneRefServiceDao.java   |  2 +-
 .../ranger/db/XXSecurityZoneRefTagServiceDao.java       |  2 +-
 .../main/java/org/apache/ranger/db/XXServiceDao.java    |  2 +-
 .../main/java/org/apache/ranger/rest/PublicAPIsv2.java  |  3 ++-
 .../main/java/org/apache/ranger/rest/ServiceREST.java   | 17 ++++++++---------
 .../apache/ranger/security/context/RangerAPIList.java   |  5 +++++
 .../ranger/security/context/RangerAPIMapping.java       |  5 +++++
 .../src/main/resources/META-INF/jpa_named_queries.xml   |  6 +++---
 10 files changed, 51 insertions(+), 16 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
index 7303bc746..da2488567 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerServiceHeaderInfo.java
@@ -56,6 +56,16 @@ public class RangerServiceHeaderInfo extends 
RangerBaseModelObject implements ja
         setIsTagService(EMBEDDED_SERVICEDEF_TAG_NAME.equals(type));
     }
 
+    public RangerServiceHeaderInfo(Long id, String name, String displayName, 
String type, Boolean isEnabled) {
+        super();
+        setId(id);
+        setName(name);
+        setDisplayName(displayName);
+        setType(type);
+        setIsTagService(EMBEDDED_SERVICEDEF_TAG_NAME.equals(type));
+        setIsEnabled(isEnabled);
+    }
+
     public String getName() {
         return name;
     }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
index 0d0102288..c0551a304 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RangerBizUtil.java
@@ -62,6 +62,7 @@ import org.apache.ranger.entity.XXTrxLogV2;
 import org.apache.ranger.entity.XXUser;
 import org.apache.ranger.plugin.model.RangerBaseModelObject;
 import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.model.RangerServiceHeaderInfo;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
 import org.apache.ranger.rest.ServiceREST;
 import org.apache.ranger.security.context.RangerAdminOpContext;
@@ -1266,6 +1267,10 @@ public class RangerBizUtil {
                if (xxDbBase != null && xxDbBase instanceof XXService) {
                        return hasAccessToXXService((XXService) xxDbBase, 
isKeyAdmin, isSysAdmin, isAuditor, isAuditorKeyAdmin, isUser);
                }
+
+               if (baseModel != null && baseModel instanceof 
RangerServiceHeaderInfo) {
+                       return 
hasAccessToRangerServiceHeaderInfo((RangerServiceHeaderInfo) baseModel, 
isKeyAdmin, isSysAdmin, isAuditor, isAuditorKeyAdmin, isUser);
+               }
                return false;
        }
 
@@ -1300,6 +1305,16 @@ public class RangerBizUtil {
                }
        }
 
+       private Boolean 
hasAccessToRangerServiceHeaderInfo(RangerServiceHeaderInfo serviceHeader, 
boolean isKeyAdmin, boolean isSysAdmin, boolean isAuditor, boolean 
isAuditorKeyAdmin, boolean isUser) {
+               // TODO: As of now we are allowing SYS_ADMIN to read all the
+               // services including KMS
+               if (isSysAdmin || isAuditor) {
+                       return true;
+               }
+
+               return 
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME.equals(serviceHeader.getType())
 ? (isKeyAdmin || isAuditorKeyAdmin) : isUser;
+       }
+
        public void hasAdminPermissions(String objType) {
 
                UserSessionBase session = ContextUtil.getCurrentUserSession();
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefServiceDao.java
 
b/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefServiceDao.java
index a7726d780..00d157e5c 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefServiceDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefServiceDao.java
@@ -97,7 +97,7 @@ public class XXSecurityZoneRefServiceDao extends 
BaseDao<XXSecurityZoneRefServic
             ret = new ArrayList<>(results.size());
 
             for (Object[] result : results) {
-                ret.add(new RangerServiceHeaderInfo((Long) result[0], (String) 
result[1], (String) result[2], (String) result[3]));
+                ret.add(new RangerServiceHeaderInfo((Long) result[0], (String) 
result[1], (String) result[2], (String) result[3], (Boolean) result[4]));
             }
         } else {
             ret = Collections.emptyList();
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefTagServiceDao.java
 
b/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefTagServiceDao.java
index 9e1fb13ef..9a587891e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefTagServiceDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXSecurityZoneRefTagServiceDao.java
@@ -72,7 +72,7 @@ public class XXSecurityZoneRefTagServiceDao extends 
BaseDao<XXSecurityZoneRefTag
             ret = new ArrayList<>(results.size());
 
             for (Object[] result : results) {
-                ret.add(new RangerServiceHeaderInfo((Long) result[0], (String) 
result[1], (String) result[2], (String) result[3]));
+                ret.add(new RangerServiceHeaderInfo((Long) result[0], (String) 
result[1], (String) result[2], (String) result[3], (Boolean) result[4]));
             }
         } else {
             ret = Collections.emptyList();
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
index eb7fc05ae..26c13df70 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXServiceDao.java
@@ -160,7 +160,7 @@ public class XXServiceDao extends BaseDao<XXService> {
                        ret = new ArrayList<>(results.size());
 
                        for (Object[] result : results) {
-                               ret.add(new RangerServiceHeaderInfo((Long) 
result[0], (String) result[1], (String) result[2], (String) result[3]));
+                               ret.add(new RangerServiceHeaderInfo((Long) 
result[0], (String) result[1], (String) result[2], (String) result[3], 
(Boolean) result[4]));
                        }
                } catch (NoResultException excp) {
                        ret = Collections.emptyList();
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java 
b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
index 3aeda199a..b93b63f85 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
@@ -41,6 +41,7 @@ import org.apache.ranger.plugin.store.PList;
 import org.apache.ranger.plugin.util.GrantRevokeRoleRequest;
 import org.apache.ranger.plugin.util.RangerPurgeResult;
 import org.apache.ranger.plugin.util.ServiceTags;
+import org.apache.ranger.security.context.RangerAPIList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -437,7 +438,7 @@ public class PublicAPIsv2 {
        @GET
        @Path("/api/service-headers")
        @Produces({ "application/json" })
-       @PreAuthorize("@rangerPreAuthSecurityHandler.isAPISpnegoAccessible()")
+       @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.GET_SERVICE_HEADERS + "\")")
        public List<RangerServiceHeaderInfo> getServiceHeaders(@Context 
HttpServletRequest request) {
                return serviceREST.getServiceHeaders(request);
        }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 435b78679..dade6d66b 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -1101,15 +1101,14 @@ public class ServiceREST {
 
                List<RangerServiceHeaderInfo> ret = 
daoManager.getXXService().findServiceHeaders();
 
-               if (!ret.isEmpty() && (filterByNamePrefix || filterByType)) {
-                       for (ListIterator<RangerServiceHeaderInfo> iter = 
ret.listIterator(); iter.hasNext(); ) {
-                               RangerServiceHeaderInfo serviceHeader = 
iter.next();
-
-                               if (filterByNamePrefix && 
!StringUtils.startsWithIgnoreCase(serviceHeader.getName(), namePrefix)) {
-                                       iter.remove();
-                               } else if (filterByType && 
!StringUtils.equals(serviceHeader.getType(), svcType)) {
-                                       iter.remove();
-                               }
+               for (ListIterator<RangerServiceHeaderInfo> iter = 
ret.listIterator(); iter.hasNext(); ) {
+                       RangerServiceHeaderInfo serviceHeader = iter.next();
+                       if (filterByNamePrefix && 
!StringUtils.startsWithIgnoreCase(serviceHeader.getName(), namePrefix)) {
+                               iter.remove();
+                       } else if (filterByType && 
!StringUtils.equals(serviceHeader.getType(), svcType)) {
+                               iter.remove();
+                       } else if(!bizUtil.hasAccess(null, serviceHeader)) {
+                               iter.remove();
                        }
                }
 
diff --git 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
index d8284dff6..194663425 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
@@ -212,4 +212,9 @@ public class RangerAPIList {
        public static final String 
GET_USER_ROLES_BY_NAME="XUserREST.getUserRolesByName";
        public static final String FORCE_DELETE_EXTERNAL_USERS = 
"XUserREST.forceDeleteExternalUsers";
        public static final String FORCE_DELETE_EXTERNAL_GROUPS = 
"XUserREST.forceDeleteExternalGroups";
+
+       /**
+        * List of APIs for PublicAPIsv2
+        */
+       public static final String GET_SERVICE_HEADERS = 
"PublicAPIsv2.getServiceHeaders";
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIMapping.java
 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIMapping.java
index 59cd2a6dc..37ccc0785 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIMapping.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIMapping.java
@@ -97,6 +97,7 @@ public class RangerAPIMapping {
                
apiAssociatedWithReports.add(RangerAPIList.GET_SERVICE_DEF_BY_NAME);
                apiAssociatedWithReports.add(RangerAPIList.GET_SERVICE_DEFS);
                apiAssociatedWithReports.add(RangerAPIList.GET_SERVICES);
+               apiAssociatedWithReports.add(RangerAPIList.GET_SERVICE_HEADERS);
                apiAssociatedWithReports.add(RangerAPIList.LOOKUP_RESOURCE);
 
                
apiAssociatedWithReports.add(RangerAPIList.GET_USER_PROFILE_FOR_USER);
@@ -162,6 +163,7 @@ public class RangerAPIMapping {
                
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.GET_SERVICE_DEF_BY_NAME);
                
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.GET_SERVICE_DEFS);
                apiAssociatedWithTagBasedPolicy.add(RangerAPIList.GET_SERVICES);
+               
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.GET_SERVICE_HEADERS);
                
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.LOOKUP_RESOURCE);
                
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.UPDATE_SERVICE);
                
apiAssociatedWithTagBasedPolicy.add(RangerAPIList.UPDATE_SERVICE_DEF);
@@ -246,6 +248,7 @@ public class RangerAPIMapping {
                
apiAssociatedWithKeyManager.add(RangerAPIList.GET_SERVICE_DEF_BY_NAME);
                apiAssociatedWithKeyManager.add(RangerAPIList.GET_SERVICE_DEFS);
                apiAssociatedWithKeyManager.add(RangerAPIList.GET_SERVICES);
+               
apiAssociatedWithKeyManager.add(RangerAPIList.GET_SERVICE_HEADERS);
                apiAssociatedWithKeyManager.add(RangerAPIList.LOOKUP_RESOURCE);
                apiAssociatedWithKeyManager.add(RangerAPIList.UPDATE_SERVICE);
                
apiAssociatedWithKeyManager.add(RangerAPIList.UPDATE_SERVICE_DEF);
@@ -379,6 +382,7 @@ public class RangerAPIMapping {
                
apiAssociatedWithAudit.add(RangerAPIList.GET_SERVICE_DEF_BY_NAME);
                apiAssociatedWithAudit.add(RangerAPIList.GET_SERVICE_DEFS);
                apiAssociatedWithAudit.add(RangerAPIList.GET_SERVICES);
+               apiAssociatedWithAudit.add(RangerAPIList.GET_SERVICE_HEADERS);
                apiAssociatedWithAudit.add(RangerAPIList.LOOKUP_RESOURCE);
 
                
apiAssociatedWithAudit.add(RangerAPIList.GET_USER_PROFILE_FOR_USER);
@@ -459,6 +463,7 @@ public class RangerAPIMapping {
                
apiAssociatedWithRBPolicies.add(RangerAPIList.GET_SERVICE_DEF_BY_NAME);
                apiAssociatedWithRBPolicies.add(RangerAPIList.GET_SERVICE_DEFS);
                apiAssociatedWithRBPolicies.add(RangerAPIList.GET_SERVICES);
+               
apiAssociatedWithRBPolicies.add(RangerAPIList.GET_SERVICE_HEADERS);
                apiAssociatedWithRBPolicies.add(RangerAPIList.LOOKUP_RESOURCE);
                apiAssociatedWithRBPolicies.add(RangerAPIList.UPDATE_SERVICE);
                
apiAssociatedWithRBPolicies.add(RangerAPIList.UPDATE_SERVICE_DEF);
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 616ce9924..81e52583b 100755
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -729,7 +729,7 @@
 
        <named-query name="XXService.getAllServiceHeaders">
                <query>
-                       SELECT obj.id, obj.name, obj.displayName, svcDef.name 
FROM XXService obj
+                       SELECT obj.id, obj.name, obj.displayName, svcDef.name, 
obj.isEnabled FROM XXService obj
                          LEFT OUTER JOIN XXServiceDef svcDef ON obj.type = 
svcDef.id
                </query>
        </named-query>
@@ -1775,7 +1775,7 @@
 
     <named-query 
name="XXSecurityZoneRefService.findServiceHeaderInfosByZoneId">
         <query>
-                       SELECT obj.id, obj.name, obj.displayName, svcDef.name 
FROM XXService obj
+                       SELECT obj.id, obj.name, obj.displayName, svcDef.name, 
obj.isEnabled FROM XXService obj
                          LEFT OUTER JOIN XXServiceDef svcDef ON obj.type = 
svcDef.id
                         WHERE obj.id IN (SELECT ref.serviceId FROM 
XXSecurityZoneRefService ref WHERE ref.zoneId = :zoneId)
         </query>
@@ -1795,7 +1795,7 @@
 
     <named-query 
name="XXSecurityZoneRefTagService.findServiceHeaderInfosByZoneId">
         <query>
-                       SELECT obj.id, obj.name, obj.displayName, svcDef.name 
FROM XXService obj
+                       SELECT obj.id, obj.name, obj.displayName, svcDef.name, 
obj.isEnabled FROM XXService obj
                          LEFT OUTER JOIN XXServiceDef svcDef ON obj.type = 
svcDef.id
                         WHERE obj.id IN (SELECT ref.tagServiceId FROM 
XXSecurityZoneRefTagService ref WHERE ref.zoneId = :zoneId)
         </query>

Reply via email to