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

kumaab 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 a93f26817 RANGER-5807: Exclude KMS privileges from config super users 
and fix RANGER-5627 related bugs (#1257)
a93f26817 is described below

commit a93f26817e945fe25c136fdf3a3fb4d476b49536
Author: Abhishek Kumar <[email protected]>
AuthorDate: Wed Sep 30 15:47:44 2026 -0700

    RANGER-5807: Exclude KMS privileges from config super users and fix 
RANGER-5627 related bugs (#1257)
    
    Config super users/groups (ranger.admin.super.users/groups, RANGER-5627)
    now get system admin privileges only, independent of Ranger DB roles:
    
    - Session: the super-user flag no longer makes isKeyAdmin() and
      isAuditKeyAdmin() true; key-admin and auditor flags from DB roles are
      cleared for super users.
    - Auditor block: blockAuditorRoleUser() no longer rejects super users.
      Before, isAuditUserAdmin() and isAuditKeyAdmin() were true for every
      super user, so it rejected them wherever auditors are rejected.
    - Roles: super users get ROLE_SYS_ADMIN only, whatever their roles in
      Ranger DB, for Spring authorities, the session and the profile.
      RangerSuperUserConfig.getSuperUserRoles replaces
      mergeConfigSuperUserRoles and getConfigSuperUserProfileRoles, whose
      result was always ROLE_SYS_ADMIN (plus ROLE_USER, which had no
      effect). A warning is logged when a super user also has a KMS role in
      Ranger DB.
    - KMS service-def create/update/delete follows system admin rules.
    - KMS entries are excluded from access audits and the admin audit log
      for super users.
    - Key Manager module removed from the session of all admins (DB sys
      admins are never assigned it either) and from the super-user profile.
    - User visibility (hasAccessToGetUserInfo, searchXUsers,
      checkUserAccessible) follows system admin rules, so KMS users are not
      visible/manageable by super users. As for system admins, searchXUsers
      only adds the non-KMS roles to the role filter; the per-user checks
      in hasAccessToGetUserInfo and checkUserAccessible do the enforcing.
      Two exceptions are kept in hasAccessToGetUserInfo: rangerusersync
      (when configured as a super user) still sees all users, as it does as
      a DB system admin, and a super user can always read its own user,
      even if its DB role is a KMS role.
    - New UserMgr.getDBRolesByLoginId returns DB portal roles without the
      merged super-user roles. checkUserAccessible uses it for the target
      user: before, a target that is a super user always carried
      ROLE_KEY_ADMIN, so system admins could not create or update any
      super-user account; now only a target with a KMS role in Ranger DB
      is rejected. createDefaultAccountUser also uses it to compare the
      existing roles of an external user.
    - Plugin grant/revoke is not blocked by DB auditor roles for super
      users. New RangerBizUtil.isConfigSuperUser keeps this exemption
      limited to config super users; a DB user with both system admin and
      auditor roles is still blocked, as before.
    - Config descriptions updated; unit tests updated and added.
    
    UserMgr.mapXXPortalUserToVXPortalUser replaced the role list of every
    mapped user with the config super-user roles ([ROLE_SYS_ADMIN]) whenever
    the logged-in session was a config super user. With the auditor block
    for super users lifted in the previous commit, within a super-user
    session:
    
    - /users APIs reported every user as ROLE_SYS_ADMIN.
    - UserMgr.checkAccess saw every target as a system admin, so super users
      could update the profile (name, email, roles) of KMS users (key
      admin / key admin auditor) through PUT /service/users, which system
      admins cannot.
    - Role-change bookkeeping in XUserMgr compared new roles against the
      wrong existing roles (e.g. promoting a user to ROLE_SYS_ADMIN via
      setUserRolesByName/ByExternalID was a no-op).
    
    Apply the config roles only when the mapped user is the logged-in super
    user; other users keep their DB roles.
---
 .../scripts/ranger-admin-site-template.xml         |   4 +-
 .../java/org/apache/ranger/biz/RangerBizUtil.java  |  60 ++++++-----
 .../java/org/apache/ranger/biz/SessionMgr.java     |  16 ++-
 .../main/java/org/apache/ranger/biz/UserMgr.java   |  93 ++++++++++-------
 .../main/java/org/apache/ranger/biz/XUserMgr.java  |  12 ++-
 .../ranger/common/RangerSuperUserConfig.java       |  38 ++-----
 .../org/apache/ranger/common/UserSessionBase.java  |   4 +-
 .../java/org/apache/ranger/rest/AssetREST.java     |  19 ++--
 .../java/org/apache/ranger/rest/ServiceREST.java   |   4 +-
 .../java/org/apache/ranger/rest/XUserREST.java     |   4 +-
 .../main/resources/conf.dist/ranger-admin-site.xml |   4 +-
 .../org/apache/ranger/biz/TestRangerBizUtil.java   |  77 ++++++++++++--
 .../java/org/apache/ranger/biz/TestSessionMgr.java | 116 +++++++++++++++++++--
 .../java/org/apache/ranger/biz/TestUserMgr.java    | 107 +++++++++++++++++--
 .../java/org/apache/ranger/biz/TestXUserMgr.java   |  62 +++++++++++
 .../ranger/common/TestRangerSuperUserConfig.java   |  48 +--------
 .../java/org/apache/ranger/rest/TestAssetREST.java |  13 ++-
 17 files changed, 484 insertions(+), 197 deletions(-)

diff --git a/security-admin/scripts/ranger-admin-site-template.xml 
b/security-admin/scripts/ranger-admin-site-template.xml
index ed6211cc9..f22b8322f 100644
--- a/security-admin/scripts/ranger-admin-site-template.xml
+++ b/security-admin/scripts/ranger-admin-site-template.xml
@@ -251,11 +251,11 @@
        <property>
                <name>ranger.admin.super.users</name>
                <value></value>
-               <description>Comma-separated list of users granted full Ranger 
administrative privileges at login (system admin and key admin capabilities), 
independent of database roles. Empty or absent disables config-based super 
users.</description>
+               <description>Comma-separated list of users granted full Ranger 
administrative privileges at login (system admin capabilities), independent of 
database roles. Empty or absent disables config-based super users.</description>
        </property>
        <property>
                <name>ranger.admin.super.groups</name>
                <value></value>
-               <description>Comma-separated list of groups whose members are 
granted full Ranger administrative privileges at login (system admin and key 
admin capabilities), independent of database roles. Empty or absent disables 
config-based super groups.</description>
+               <description>Comma-separated list of groups whose members are 
granted full Ranger administrative privileges at login (system admin 
capabilities), independent of database roles. Empty or absent disables 
config-based super groups.</description>
        </property>
 </configuration>
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 75756e6dd..4ccb753bb 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
@@ -1041,28 +1041,20 @@ public void hasKMSPermissions(String objType, String 
implClassName) {
             throw restErrorUtil.createRESTException("UserSession cannot be 
null, only KeyAdmin can create/update/delete " + objType, 
MessageEnums.OPER_NO_PERMISSION);
         }
 
-        if (!session.isSuperUser()) {
-            boolean isKmsServiceType = 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(implClassName);
+        boolean isKmsServiceType = 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(implClassName);
 
-            if (session.isKeyAdmin() && !isKmsServiceType) {
-                throw restErrorUtil.createRESTException("KeyAdmin can 
create/update/delete only KMS " + objType, MessageEnums.OPER_NO_PERMISSION);
-            }
+        if (session.isKeyAdmin() && !isKmsServiceType) {
+            throw restErrorUtil.createRESTException("KeyAdmin can 
create/update/delete only KMS " + objType, MessageEnums.OPER_NO_PERMISSION);
+        }
 
-            if (session.isUserAdmin() && isKmsServiceType && 
"Service-Def".equalsIgnoreCase(objType)) {
-                throw restErrorUtil.createRESTException("System Admin cannot 
create/update/delete KMS " + objType, MessageEnums.OPER_NO_PERMISSION);
-            }
+        if (session.isUserAdmin() && isKmsServiceType && 
"Service-Def".equalsIgnoreCase(objType)) {
+            throw restErrorUtil.createRESTException("System Admin cannot 
create/update/delete KMS " + objType, MessageEnums.OPER_NO_PERMISSION);
         }
     }
 
     public boolean checkUserAccessible(VXUser vXUser) {
-        // Config super-user (ranger.admin.super.users/groups) bypasses the
-        // mutual admin/key-admin visibility restrictions below.
-        if (isSuperUser()) {
-            return true;
-        }
-
         boolean            isAccessible = true;
-        Collection<String> roleList     = 
userMgr.getRolesByLoginId(vXUser.getName());
+        Collection<String> roleList     = 
userMgr.getDBRolesByLoginId(vXUser.getName());
         Collection<String> payloadRoles = vXUser.getUserRoleList();
 
         if (isKeyAdmin()) {
@@ -1144,17 +1136,7 @@ public boolean isUserRangerAdmin(String username) {
         }
 
         // Config super-user when no session context (e.g. grantor checks).
-        final boolean configSuperUser;
-
-        if (RangerSuperUserConfig.isSuperUser(username)) {
-            configSuperUser = true;
-        } else if (RangerSuperUserConfig.isSuperGroupsConfigured() && xUserMgr 
!= null) {
-            configSuperUser = RangerSuperUserConfig.isSuperUser(username, 
xUserMgr.getGroupsForUser(username));
-        } else {
-            configSuperUser = false;
-        }
-
-        if (configSuperUser) {
+        if (isConfigSuperUser(username)) {
             return true;
         }
 
@@ -1173,6 +1155,20 @@ public boolean isUserRangerAdmin(String username) {
         return isAdmin;
     }
 
+    /* True when username matches ranger.admin.super.users/groups, regardless 
of
+     * the current session and of the user's DB portal roles. */
+    public boolean isConfigSuperUser(String username) {
+        if (StringUtils.isBlank(username)) {
+            return false;
+        } else if (RangerSuperUserConfig.isSuperUser(username)) {
+            return true;
+        } else if (RangerSuperUserConfig.isSuperGroupsConfigured() && xUserMgr 
!= null) {
+            return RangerSuperUserConfig.isSuperUser(username, 
xUserMgr.getGroupsForUser(username));
+        }
+
+        return false;
+    }
+
     public boolean isHealthCheckUser(String user) {
         return HEALTHCHECK_USERNAME.equalsIgnoreCase(user);
     }
@@ -1238,13 +1234,15 @@ public void blockAuditorRoleUser() {
         UserSessionBase session = ContextUtil.getCurrentUserSession();
 
         if (session != null) {
-            if (session.isAuditKeyAdmin() || session.isAuditUserAdmin()) {
-                VXResponse vXResponse = new VXResponse();
+            if (!session.isSuperUser()) {
+                if (session.isAuditKeyAdmin() || session.isAuditUserAdmin()) {
+                    VXResponse vXResponse = new VXResponse();
 
-                vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
-                vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + 
session.getXXPortalUser().getId() + " ,isn't permitted to perform the action.");
+                    vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
+                    vXResponse.setMsgDesc("Operation denied. LoggedInUser=" + 
session.getXXPortalUser().getId() + " ,isn't permitted to perform the action.");
 
-                throw restErrorUtil.generateRESTException(vXResponse);
+                    throw restErrorUtil.generateRESTException(vXResponse);
+                }
             }
         } else {
             VXResponse vXResponse = new VXResponse();
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
index 55e37fcbc..b2b6d591a 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/SessionMgr.java
@@ -267,7 +267,10 @@ public void resetUserModulePermission(UserSessionBase 
userSession) {
             List<String> permissionList;
 
             if (userSession.isUserAdmin()) {
-                permissionList = 
daoManager.getXXModuleDef().getAllModuleNames();
+                permissionList = new 
ArrayList<>(daoManager.getXXModuleDef().getAllModuleNames());
+
+                // Key Manager is for key admins only, not for sys admins or 
config super-users.
+                permissionList.remove(RangerConstants.MODULE_KEY_MANAGER);
             } else {
                 permissionList = 
daoManager.getXXModuleDef().findAccessibleModulesByUserId(userSession.getUserId(),
 xUser.getId());
             }
@@ -804,7 +807,16 @@ private void setUserRoles(UserSessionBase userSession) {
         applyConfigSuperUserSessionFlags(userSession);
 
         if (userSession.isSuperUser()) {
-            strRoleList = 
RangerSuperUserConfig.mergeConfigSuperUserRoles(strRoleList, true);
+            if (strRoleList.contains(RangerConstants.ROLE_KEY_ADMIN) || 
strRoleList.contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+                logger.warn("User {} is configured as a config super-user but 
has KMS role(s) {} in Ranger DB; KMS privileges are not granted to config 
super-users. Remove the user from ranger.admin.super.users/groups or remove the 
KMS role.", userSession.getLoginId(), strRoleList);
+            }
+
+            // Config super-users act as system admin regardless of DB portal 
roles.
+            userSession.setKeyAdmin(false);
+            userSession.setAuditKeyAdmin(false);
+            userSession.setAuditUserAdmin(false);
+
+            strRoleList = RangerSuperUserConfig.getSuperUserRoles();
         }
 
         userSession.setUserRoleList(strRoleList);
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
index 63da869df..7f6b7c020 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/UserMgr.java
@@ -640,8 +640,9 @@ public VXPortalUser 
mapXXPortalUserToVXPortalUser(XXPortalUser user, Collection<
             if (userRoleList == null) {
                 userRoleList = new ArrayList<>();
 
-                if (sess.isSuperUser()) {
-                    
userRoleList.addAll(RangerSuperUserConfig.getConfigSuperUserProfileRoles());
+                // Config roles apply only to the super user's own profile; 
other users keep their DB roles.
+                if (sess.isSuperUser() && sess.getXXPortalUser() != null && 
sess.getXXPortalUser().getId().equals(user.getId())) {
+                    
userRoleList.addAll(RangerSuperUserConfig.getSuperUserRoles());
                 } else {
                     List<XXPortalUserRole> gjUserRoleList = 
daoManager.getXXPortalUserRole().findByParentId(user.getId());
 
@@ -1018,7 +1019,7 @@ public VXPortalUser createDefaultAccountUser(VXPortalUser 
userProfile) {
 
             if (userProfile.getUserRoleList() != null && 
!userProfile.getUserRoleList().isEmpty() && ((List<String>) 
userProfile.getUserRoleList()).get(0) != null) {
                 reqRoleList      = userProfile.getUserRoleList();
-                existingRoleList = this.getRolesByLoginId(loginId);
+                existingRoleList = this.getDBRolesByLoginId(loginId);
 
                 XXPortalUser xxPortalUser = 
daoManager.getXXPortalUser().findByLoginId(userProfile.getLoginId());
 
@@ -1126,31 +1127,7 @@ public void checkAdminAccess() {
     }
 
     public Collection<String> getRolesByLoginId(String loginId) {
-        if (loginId == null || loginId.trim().isEmpty()) {
-            return DEFAULT_ROLE_LIST;
-        }
-
-        XXPortalUser xXPortalUser = 
daoManager.getXXPortalUser().findByLoginId(loginId);
-
-        if (xXPortalUser == null) {
-            return DEFAULT_ROLE_LIST;
-        }
-
-        Collection<XXPortalUserRole> xXPortalUserRoles = 
daoManager.getXXPortalUserRole().findByUserId(xXPortalUser.getId());
-
-        if (xXPortalUserRoles == null) {
-            return DEFAULT_ROLE_LIST;
-        }
-
-        Collection<String> roleList = new ArrayList<>();
-
-        for (XXPortalUserRole role : xXPortalUserRoles) {
-            if (role != null && VALID_ROLE_LIST.contains(role.getUserRole())) {
-                if (!roleList.contains(role.getUserRole())) {
-                    roleList.add(role.getUserRole());
-                }
-            }
-        }
+        Collection<String> roleList = findDBRolesByLoginId(loginId);
 
         if (roleList.isEmpty()) {
             return DEFAULT_ROLE_LIST;
@@ -1171,12 +1148,20 @@ public Collection<String> getRolesByLoginId(String 
loginId) {
         }
 
         if (configSuperUser) {
-            return RangerSuperUserConfig.mergeConfigSuperUserRoles(roleList, 
false);
+            return RangerSuperUserConfig.getSuperUserRoles();
         }
 
         return roleList;
     }
 
+    /* Portal roles stored in Ranger DB, without config super-user roles; use 
when
+     * checking or updating the roles of a user other than the logged-in one. 
*/
+    public Collection<String> getDBRolesByLoginId(String loginId) {
+        Collection<String> roleList = findDBRolesByLoginId(loginId);
+
+        return roleList.isEmpty() ? DEFAULT_ROLE_LIST : roleList;
+    }
+
     public boolean isUserNotActive(String loginId) {
         if (loginId == null || loginId.trim().isEmpty()) {
             return false;
@@ -1343,7 +1328,7 @@ private void applyConfigSuperUserProfileOverrides(final 
VXPortalUser userProfile
             return;
         }
 
-        List<String> effectiveRoles = 
RangerSuperUserConfig.getConfigSuperUserProfileRoles();
+        List<String> effectiveRoles = 
RangerSuperUserConfig.getSuperUserRoles();
 
         userProfile.setUserRoleList(effectiveRoles);
 
@@ -1355,14 +1340,17 @@ private void applyConfigSuperUserProfileOverrides(final 
VXPortalUser userProfile
             Long   xUserId = xUser != null ? xUser.getId() : null;
 
             for (XXModuleDef moduleDef : moduleDefs) {
-                VXUserPermission vxUserPermission = new VXUserPermission();
+                // Config super-users get sys-admin modules only.
+                if 
(!RangerConstants.MODULE_KEY_MANAGER.equals(moduleDef.getModule())) {
+                    VXUserPermission vxUserPermission = new VXUserPermission();
 
-                vxUserPermission.setModuleId(moduleDef.getId());
-                vxUserPermission.setModuleName(moduleDef.getModule());
-                vxUserPermission.setUserId(xUserId);
-                vxUserPermission.setIsAllowed(RangerCommonEnums.IS_ALLOWED);
+                    vxUserPermission.setModuleId(moduleDef.getId());
+                    vxUserPermission.setModuleName(moduleDef.getModule());
+                    vxUserPermission.setUserId(xUserId);
+                    
vxUserPermission.setIsAllowed(RangerCommonEnums.IS_ALLOWED);
 
-                effectiveModules.add(vxUserPermission);
+                    effectiveModules.add(vxUserPermission);
+                }
             }
         }
 
@@ -1607,11 +1595,42 @@ private String encodeString(String text, String salt, 
String algorithm) {
         }
     }
 
+    private Collection<String> findDBRolesByLoginId(String loginId) {
+        Collection<String> roleList = new ArrayList<>();
+
+        if (loginId == null || loginId.trim().isEmpty()) {
+            return roleList;
+        }
+
+        XXPortalUser xXPortalUser = 
daoManager.getXXPortalUser().findByLoginId(loginId);
+
+        if (xXPortalUser == null) {
+            return roleList;
+        }
+
+        Collection<XXPortalUserRole> xXPortalUserRoles = 
daoManager.getXXPortalUserRole().findByUserId(xXPortalUser.getId());
+
+        if (xXPortalUserRoles != null) {
+            for (XXPortalUserRole role : xXPortalUserRoles) {
+                if (role != null && 
VALID_ROLE_LIST.contains(role.getUserRole()) && 
!roleList.contains(role.getUserRole())) {
+                    roleList.add(role.getUserRole());
+                }
+            }
+        }
+
+        return roleList;
+    }
+
     private boolean hasAccessToGetUserInfo(final VXPortalUser requestedVXUser) 
{
         UserSessionBase userSession = ContextUtil.getCurrentUserSession();
 
         if (userSession != null && userSession.isSuperUser()) {
-            return true;
+            /* rangerusersync must see all users; a super user can always see 
self. */
+            if ("rangerusersync".equalsIgnoreCase(userSession.getLoginId()) || 
StringUtils.equals(requestedVXUser.getLoginId(), userSession.getLoginId())) {
+                return true;
+            }
+
+            return 
requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) || 
requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) 
|| requestedVXUser.getUserRoleList().contains(RangerConstants.ROLE_USER);
         }
 
         if (userSession != null && userSession.getLoginId() != null) {
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 3e97601ab..6bd205d9b 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -3322,7 +3322,17 @@ private boolean hasAccessToGetUserInfo(VXUser 
requestedVXUser) {
         UserSessionBase userSession = ContextUtil.getCurrentUserSession();
 
         if (userSession != null && userSession.isSuperUser()) {
-            return true;
+            if (requestedVXUser == null || 
CollectionUtils.isEmpty(requestedVXUser.getUserRoleList())) {
+                return false;
+            }
+
+            /* rangerusersync must see all users; a super user can always see 
self,
+             * even when its DB role is a KMS role. */
+            if ("rangerusersync".equalsIgnoreCase(userSession.getLoginId()) || 
StringUtils.equals(requestedVXUser.getName(), userSession.getLoginId())) {
+                return true;
+            }
+
+            return 
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(), 
RangerConstants.ROLE_SYS_ADMIN) || 
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(), 
RangerConstants.ROLE_ADMIN_AUDITOR) || 
StringUtil.containsIgnoreCase(requestedVXUser.getUserRoleList(), 
RangerConstants.ROLE_USER);
         }
 
         if (userSession != null && userSession.getLoginId() != null) {
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
 
b/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
index d2bc2f65e..e78192452 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/common/RangerSuperUserConfig.java
@@ -23,10 +23,8 @@
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -34,8 +32,7 @@
  * Configuration-based Ranger Admin superusers and super groups.
  * When {@code ranger.admin.super.users} or
  * {@code ranger.admin.super.groups} are set, matching authenticated users
- * receive full Ranger administrative privileges (system admin and key admin
- * capabilities) without requiring corresponding roles in the Ranger database.
+ * receive full Ranger administrative privileges (system admin) without 
requiring corresponding roles in the Ranger database.
  */
 public final class RangerSuperUserConfig {
     private static volatile RangerSuperUserConfig instance;
@@ -117,35 +114,14 @@ public static boolean isSuperUser(final String userName, 
final Set<String> userG
     }
 
     /**
-     * Merges config super-user admin roles with existing portal roles.
-     * Used for Spring Security authentication and session role lists.
+     * Portal roles of a config super-user: {@code ROLE_SYS_ADMIN} only, 
whatever
+     * its roles in the Ranger DB. Used for Spring Security authorities, the
+     * session role list and {@code GET /users/profile}.
      *
-     * @param existingRoles DB portal roles (may be null)
-     * @param includeRoleUser when true, adds {@code ROLE_USER} (session lists)
-     * @return merged role list with stable ordering
+     * @return a new, modifiable list
      */
-    public static List<String> mergeConfigSuperUserRoles(final 
Collection<String> existingRoles, final boolean includeRoleUser) {
-        LinkedHashSet<String> merged = new LinkedHashSet<>();
-
-        merged.add(RangerConstants.ROLE_SYS_ADMIN);
-        merged.add(RangerConstants.ROLE_KEY_ADMIN);
-
-        if (includeRoleUser) {
-            merged.add(RangerConstants.ROLE_USER);
-        }
-
-        if (existingRoles != null) {
-            merged.addAll(existingRoles);
-        }
-
-        return new ArrayList<>(merged);
-    }
-
-    /**
-     * Admin roles exposed on {@code GET /user/profile} for config super-users.
-     */
-    public static List<String> getConfigSuperUserProfileRoles() {
-        return mergeConfigSuperUserRoles(Collections.emptyList(), false);
+    public static List<String> getSuperUserRoles() {
+        return new 
ArrayList<>(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN));
     }
 
     private static Set<String> parsePropertyValues(final String[] values) {
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java 
b/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
index 08bb55dde..3847fee2e 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/UserSessionBase.java
@@ -122,7 +122,7 @@ public void setClientTimeOffsetInMinute(int 
clientTimeOffsetInMinute) {
     }
 
     public boolean isKeyAdmin() {
-        return superUser || keyAdmin;
+        return keyAdmin;
     }
 
     public void setKeyAdmin(boolean keyAdmin) {
@@ -149,7 +149,7 @@ public boolean isSingleRoleUserSession() {
     }
 
     public boolean isAuditKeyAdmin() {
-        return superUser || auditKeyAdmin;
+        return auditKeyAdmin;
     }
 
     public void setAuditKeyAdmin(boolean auditKeyAdmin) {
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
index 9104cd1e4..0e93fd9af 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
@@ -568,17 +568,14 @@ public VXAccessAuditList getAccessLogs(@Context 
HttpServletRequest request, @Que
         searchUtil.extractString(request, searchCriteria, "datasets", 
"DataSets", null);
         searchUtil.extractLong(request, searchCriteria, "datasetIds", "Dataset 
Ids");
 
-        // Config super-users see all audit logs (same as full admin), not 
KMS-only filtering.
-        if (!msBizUtil.isSuperUser()) {
-            XXServiceDef xxServiceDef = 
daoManager.getXXServiceDef().findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME);
-
-            if (xxServiceDef != null) {
-                // Key admin / audit key admin: KMS audits only; others: 
exclude KMS.
-                if (msBizUtil.isKeyAdmin() || msBizUtil.isAuditKeyAdmin()) {
-                    searchCriteria.getParamList().put("repoType", 
xxServiceDef.getId());
-                } else if (xxServiceDef != null) {
-                    searchCriteria.getParamList().put("-repoType", 
xxServiceDef.getId());
-                }
+        XXServiceDef xxServiceDef = 
daoManager.getXXServiceDef().findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME);
+
+        if (xxServiceDef != null) {
+            // Key admin / audit key admin: KMS audits only; others: exclude 
KMS.
+            if (msBizUtil.isKeyAdmin() || msBizUtil.isAuditKeyAdmin()) {
+                searchCriteria.getParamList().put("repoType", 
xxServiceDef.getId());
+            } else if (xxServiceDef != null) {
+                searchCriteria.getParamList().put("-repoType", 
xxServiceDef.getId());
             }
         }
 
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 25534c214..5197b2aff 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
@@ -1190,7 +1190,7 @@ public RESTResponse grantAccess(@PathParam("serviceName") 
String serviceName, Gr
                 Set<String>          accessTypes = 
grantRequest.getAccessTypes();
                 VXUser               vxUser      = 
xUserService.getXUserByUserName(userName);
 
-                if 
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+                if 
((vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) && 
!bizUtil.isConfigSuperUser(userName)) {
                     VXResponse vXResponse = new VXResponse();
 
                     vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
@@ -1435,7 +1435,7 @@ public RESTResponse 
revokeAccess(@PathParam("serviceName") String serviceName, G
                     Set<String>          accessTypes = 
revokeRequest.getAccessTypes();
                     VXUser               vxUser      = 
xUserService.getXUserByUserName(userName);
 
-                    if 
(vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) {
+                    if 
((vxUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR) || 
vxUser.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR)) && 
!bizUtil.isConfigSuperUser(userName)) {
                         VXResponse vXResponse = new VXResponse();
 
                         
vXResponse.setStatusCode(HttpServletResponse.SC_FORBIDDEN);
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
index 1e8d24d0a..0b93b6c4f 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
@@ -438,8 +438,8 @@ public VXUserList searchXUsers(@Context HttpServletRequest 
request, @QueryParam(
         if (userSession != null && userSession.getLoginId() != null) {
             VXUser loggedInVXUser = 
xUserService.getXUserByUserName(userSession.getLoginId());
 
-            if (loggedInVXUser != null && 
loggedInVXUser.getUserRoleList().size() == 1) {
-                if 
(loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) || 
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR)) {
+            if (loggedInVXUser != null && (userSession.isSuperUser() || 
loggedInVXUser.getUserRoleList().size() == 1)) {
+                if (userSession.isSuperUser() || 
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN) || 
loggedInVXUser.getUserRoleList().contains(RangerConstants.ROLE_ADMIN_AUDITOR)) {
                     boolean hasRole = false;
 
                     hasRole = 
!userRolesList.contains(RangerConstants.ROLE_SYS_ADMIN) ? 
userRolesList.add(RangerConstants.ROLE_SYS_ADMIN) : hasRole;
diff --git a/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml 
b/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
index 17c9aec1c..4309c3c36 100644
--- a/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
+++ b/security-admin/src/main/resources/conf.dist/ranger-admin-site.xml
@@ -492,12 +492,12 @@
                <property>
                        <name>ranger.admin.super.users</name>
                        <value></value>
-                       <description>Comma-separated list of users granted full 
Ranger administrative privileges at login (system admin and key admin 
capabilities), independent of database roles. Empty or absent disables 
config-based super users.</description>
+                       <description>Comma-separated list of users granted full 
Ranger administrative privileges at login (system admin capabilities), 
independent of database roles. Empty or absent disables config-based super 
users.</description>
                </property>
                <property>
                        <name>ranger.admin.super.groups</name>
                        <value></value>
-                       <description>Comma-separated list of groups whose 
members are granted full Ranger administrative privileges at login (system 
admin and key admin capabilities), independent of database roles. Empty or 
absent disables config-based super groups.</description>
+                       <description>Comma-separated list of groups whose 
members are granted full Ranger administrative privileges at login (system 
admin capabilities), independent of database roles. Empty or absent disables 
config-based super groups.</description>
                </property>
        <property>
                <name>xasecure.audit.jaas.Client.loginModuleName</name>
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
index bc94001ef..4965c423b 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestRangerBizUtil.java
@@ -76,6 +76,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -453,7 +454,7 @@ public void testMatchHivePolicy() {
     public void 
testCheckUserAccessibleThrowErrorForKeyAdminAndUserRoleSysAdmin() {
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_SYS_ADMIN);
-        Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+        Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
                 roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
@@ -477,7 +478,7 @@ public void 
testCheckUserAccessibleThrowErrorForKeyAdminAndUserRoleSysAdmin() {
     public void 
testCheckUserAccessibleThrowErrorForKeyAdminAndUserRoleAdminAuditor() {
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_ADMIN_AUDITOR);
-        
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+        
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
         currentUserSession.setKeyAdmin(true);
@@ -501,7 +502,7 @@ public void testCheckUserAccessibleSuccessForKeyAdmin() {
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_KEY_ADMIN);
         roleList.add(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
-        
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+        
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
         currentUserSession.setKeyAdmin(true);
@@ -520,7 +521,7 @@ public void testCheckUserAccessibleSuccessForKeyAdmin() {
     public void testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdmin() 
{
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_KEY_ADMIN);
-        Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(
+        Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(
                 roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
@@ -545,7 +546,7 @@ public void 
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdmin() {
     public void 
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdminAuditor() {
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
-        
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+        
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
         currentUserSession.setUserAdmin(true);
@@ -569,7 +570,7 @@ public void 
testCheckUserAccessibleThrowErrorForAdminAndUserRoleKeyAdminAuditor(
     public void testCheckUserAccessibleSuccessForAdmin() {
         Collection<String> roleList = new ArrayList<>();
         roleList.add(RangerConstants.ROLE_SYS_ADMIN);
-        
Mockito.when(userMgr.getRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+        
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
         Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
 
         currentUserSession.setUserAdmin(true);
@@ -887,6 +888,32 @@ public void testIsUserRangerAdmin_ConfigSuperUser() {
         RangerSuperUserConfig.resetForTests();
     }
 
+    @Test
+    public void testIsConfigSuperUser() {
+        RangerSuperUserConfig.resetForTests();
+        
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS, 
"config-admin");
+        
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_GROUPS,
 "super-group");
+
+        
Mockito.when(xUserMgr.getGroupsForUser("group-member")).thenReturn(Collections.singleton("super-group"));
+        
Mockito.when(xUserMgr.getGroupsForUser("db-admin")).thenReturn(Collections.emptySet());
+
+        XXPortalUser portalUser = new XXPortalUser();
+        portalUser.setLoginId("db-admin");
+
+        UserSessionBase session = 
RangerContextHolder.getSecurityContext().getUserSession();
+        session.setXXPortalUser(portalUser);
+        session.setUserAdmin(true);
+
+        Assertions.assertTrue(rangerBizUtil.isConfigSuperUser("config-admin"));
+        Assertions.assertTrue(rangerBizUtil.isConfigSuperUser("group-member"));
+        Assertions.assertFalse(rangerBizUtil.isConfigSuperUser("db-admin"));
+        Assertions.assertFalse(rangerBizUtil.isConfigSuperUser(" "));
+
+        
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+        
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_GROUPS);
+        RangerSuperUserConfig.resetForTests();
+    }
+
     @Test
     public void testIsUserRangerAdmin_ConfigDisabledSkipsGroupLookup() {
         Assertions.assertFalse(rangerBizUtil.isUserRangerAdmin("any-user"));
@@ -997,10 +1024,42 @@ public void 
testHasKMSPermissions_ThrowsForSysAdminOnServiceDefKMS() {
     }
 
     @Test
-    public void testHasKMSPermissions_AllowsConfigSuperUserOnServiceDefKMS() {
-        
RangerContextHolder.getSecurityContext().getUserSession().setUserAdmin(true);
+    public void testHasKMSPermissions_DeniesConfigSuperUserOnServiceDefKMS() {
+        
RangerContextHolder.getSecurityContext().getUserSession().setSuperUser(true);
+
+        WebApplicationException webExp = new WebApplicationException();
+
+        Mockito.when(restErrorUtil.createRESTException("System Admin cannot 
create/update/delete KMS Service-Def", 
MessageEnums.OPER_NO_PERMISSION)).thenReturn(webExp);
+
+        Assertions.assertThrows(WebApplicationException.class, () -> 
rangerBizUtil.hasKMSPermissions("Service-Def", 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME));
+    }
+
+    @Test
+    public void testHasKMSPermissions_AllowsConfigSuperUserOnKMSService() {
         
RangerContextHolder.getSecurityContext().getUserSession().setSuperUser(true);
-        Assertions.assertDoesNotThrow(() -> 
rangerBizUtil.hasKMSPermissions("Service-Def", 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME));
+
+        Assertions.assertDoesNotThrow(() -> 
rangerBizUtil.hasKMSPermissions("Service", 
EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME));
+    }
+
+    @Test
+    public void 
testCheckUserAccessible_ConfigSuperUserCannotManageKeyAdminUser() {
+        List<String> roleList = new ArrayList<>();
+        roleList.add(RangerConstants.ROLE_KEY_ADMIN);
+        
Mockito.when(userMgr.getDBRolesByLoginId(vXUser.getName())).thenReturn(roleList);
+        Mockito.when(vXUser.getUserRoleList()).thenReturn(roleList);
+
+        UserSessionBase session = new UserSessionBase();
+        session.setSuperUser(true);
+
+        RangerSecurityContext context = new RangerSecurityContext();
+        context.setUserSession(session);
+        RangerContextHolder.setSecurityContext(context);
+
+        WebApplicationException webExp = new WebApplicationException();
+
+        Mockito.when(restErrorUtil.createRESTException("Logged in user is not 
allowed to create/update user", 
MessageEnums.OPER_NO_PERMISSION)).thenReturn(webExp);
+
+        Assertions.assertThrows(WebApplicationException.class, () -> 
rangerBizUtil.checkUserAccessible(vXUser));
     }
 
     @Test
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
index 3d7c7a214..9270ec751 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestSessionMgr.java
@@ -627,11 +627,11 @@ public void testSetUserRoles_ConfigSuperUserAndGroup() {
         sessionMgr.resetUserSessionForProfiles(userSession);
 
         assertTrue(userSession.isUserAdmin());
-        assertTrue(userSession.isKeyAdmin());
+        assertFalse(userSession.isKeyAdmin());
+        assertFalse(userSession.isAuditKeyAdmin());
         assertTrue(userSession.isSuperUser());
         
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN));
-        
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
-        
assertTrue(userSession.getUserRoleList().contains(RangerConstants.ROLE_USER));
+        
assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN), 
userSession.getUserRoleList());
         assertFalse(userSession.isSingleRoleUserSession());
         verify(xUserMgr, never()).getGroupsForUser(anyString());
 
@@ -648,7 +648,7 @@ public void testSetUserRoles_ConfigSuperUserAndGroup() {
         sessionMgr.resetUserSessionForProfiles(userSession);
 
         assertTrue(userSession.isUserAdmin());
-        assertTrue(userSession.isKeyAdmin());
+        assertFalse(userSession.isKeyAdmin());
         assertTrue(userSession.isSuperUser());
 
         
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_GROUPS);
@@ -704,7 +704,7 @@ public void testIsUserAdminIncludesSuperUserFlag() {
     }
 
     @Test
-    public void testSetUserRoles_ConfigSuperUserGrantsKeyAdminForSysAdmin() {
+    public void 
testSetUserRoles_ConfigSuperUserDoesNotGrantKeyAdminForSysAdmin() {
         RangerSuperUserConfig.resetForTests();
         
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS, 
"config-admin");
 
@@ -732,13 +732,117 @@ public void 
testSetUserRoles_ConfigSuperUserGrantsKeyAdminForSysAdmin() {
         sessionMgr.resetUserSessionForProfiles(userSession);
 
         assertTrue(userSession.isUserAdmin());
-        assertTrue(userSession.isKeyAdmin());
+        assertFalse(userSession.isKeyAdmin());
         assertTrue(userSession.isSuperUser());
+        
assertFalse(userSession.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
         verify(xUserMgr, never()).getGroupsForUser(anyString());
 
         
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
     }
 
+    @Test
+    public void 
testResetUserModulePermission_ConfigSuperUserExcludesKeyManager() {
+        UserSessionBase userSession = superUserSessionWithModules();
+
+        sessionMgr.resetUserModulePermission(userSession);
+
+        Set<String> permissions = 
userSession.getRangerUserPermission().getUserPermissions();
+
+        assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+        assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+    }
+
+    @Test
+    public void testResetUserModulePermission_SysAdminExcludesKeyManager() {
+        UserSessionBase userSession = superUserSessionWithModules();
+
+        userSession.setSuperUser(false);
+        userSession.setUserAdmin(true);
+
+        sessionMgr.resetUserModulePermission(userSession);
+
+        Set<String> permissions = 
userSession.getRangerUserPermission().getUserPermissions();
+
+        assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+        assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+    }
+
+    @Test
+    public void 
testResetUserModulePermission_ConfigSuperUserExcludesKeyManagerEvenWithKeyAdminFlag()
 {
+        UserSessionBase userSession = superUserSessionWithModules();
+
+        userSession.setKeyAdmin(true);
+
+        sessionMgr.resetUserModulePermission(userSession);
+
+        Set<String> permissions = 
userSession.getRangerUserPermission().getUserPermissions();
+
+        assertTrue(permissions.contains(RangerConstants.MODULE_AUDIT));
+        assertFalse(permissions.contains(RangerConstants.MODULE_KEY_MANAGER));
+    }
+
+    @Test
+    public void testSetUserRoles_ConfigSuperUserIgnoresDbKeyAdminRole() {
+        RangerSuperUserConfig.resetForTests();
+        
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS, 
"config-admin");
+
+        UserSessionBase userSession = new UserSessionBase();
+        XXPortalUser    portalUser  = new XXPortalUser();
+
+        portalUser.setId(45L);
+        portalUser.setLoginId("config-admin");
+        userSession.setXXPortalUser(portalUser);
+
+        XXPortalUserDao portalDao = mock(XXPortalUserDao.class);
+
+        when(daoManager.getXXPortalUser()).thenReturn(portalDao);
+        when(portalDao.findByLoginId("config-admin")).thenReturn(portalUser);
+
+        XXPortalUserRole keyAdminRole = new XXPortalUserRole();
+
+        keyAdminRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+
+        XXPortalUserRoleDao roleDao = mock(XXPortalUserRoleDao.class);
+
+        when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+        
when(roleDao.findByUserId(45L)).thenReturn(Collections.singletonList(keyAdminRole));
+
+        sessionMgr.resetUserSessionForProfiles(userSession);
+
+        assertTrue(userSession.isSuperUser());
+        assertTrue(userSession.isUserAdmin());
+        assertFalse(userSession.isKeyAdmin());
+        assertFalse(userSession.isAuditKeyAdmin());
+        
assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN), 
userSession.getUserRoleList());
+
+        
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+        RangerSuperUserConfig.resetForTests();
+    }
+
+    private UserSessionBase superUserSessionWithModules() {
+        UserSessionBase userSession = new UserSessionBase();
+        XXPortalUser    portalUser  = new XXPortalUser();
+
+        portalUser.setId(44L);
+        portalUser.setLoginId("config-admin");
+        userSession.setXXPortalUser(portalUser);
+        userSession.setSuperUser(true);
+
+        XXUser xUser = new XXUser();
+
+        xUser.setId(144L);
+
+        XXUserDao      xUserDao     = mock(XXUserDao.class);
+        XXModuleDefDao moduleDefDao = mock(XXModuleDefDao.class);
+
+        when(daoManager.getXXUser()).thenReturn(xUserDao);
+        when(xUserDao.findByUserName("config-admin")).thenReturn(xUser);
+        when(daoManager.getXXModuleDef()).thenReturn(moduleDefDao);
+        
when(moduleDefDao.getAllModuleNames()).thenReturn(Arrays.asList(RangerConstants.MODULE_AUDIT,
 RangerConstants.MODULE_KEY_MANAGER));
+
+        return userSession;
+    }
+
     @Test
     public void testProcessSuccessLogin_LimitZeroDoesNotExpireOldestSession() {
         RangerContextHolder.setSecurityContext(null);
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
index ab4d0ddf6..420c2cc01 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestUserMgr.java
@@ -1689,9 +1689,7 @@ public void testGetRolesByLoginId_ConfigSuperUser() {
 
         Collection<String> roles = userMgr.getRolesByLoginId(userLoginId);
 
-        Assertions.assertTrue(roles.contains(RangerConstants.ROLE_USER));
-        Assertions.assertTrue(roles.contains(RangerConstants.ROLE_SYS_ADMIN));
-        Assertions.assertTrue(roles.contains(RangerConstants.ROLE_KEY_ADMIN));
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
 new ArrayList<>(roles));
 
         
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
         RangerSuperUserConfig.resetForTests();
@@ -1703,6 +1701,38 @@ public void testGetRolesByLoginId_ConfigSuperUser() {
         RangerSuperUserConfig.resetForTests();
     }
 
+    @Test
+    public void testGetDBRolesByLoginId_ConfigSuperUserKeepsDBRoles() {
+        setup();
+        XXPortalUserDao     userDao = Mockito.mock(XXPortalUserDao.class);
+        XXPortalUserRoleDao roleDao = Mockito.mock(XXPortalUserRoleDao.class);
+
+        VXPortalUser userProfile = userProfile();
+        String       userLoginId = userProfile.getLoginId();
+
+        XXPortalUser user = new XXPortalUser();
+        user.setLoginId(userLoginId);
+        user.setId(userProfile.getId());
+
+        XXPortalUserRole xxPortalUserRole = new XXPortalUserRole();
+        xxPortalUserRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+        List<XXPortalUserRole> list = new ArrayList<>();
+        list.add(xxPortalUserRole);
+
+        Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
+        Mockito.when(userDao.findByLoginId(userLoginId)).thenReturn(user);
+        Mockito.when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+        Mockito.when(roleDao.findByUserId(user.getId())).thenReturn(list);
+        RangerSuperUserConfig.resetForTests();
+        
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS, 
userLoginId);
+
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN),
 new ArrayList<>(userMgr.getDBRolesByLoginId(userLoginId)));
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
 new ArrayList<>(userMgr.getRolesByLoginId(userLoginId)));
+
+        
PropertiesUtil.getPropertiesMap().remove(RangerConstants.RANGER_ADMIN_SUPER_USERS);
+        RangerSuperUserConfig.resetForTests();
+    }
+
     @Test
     public void testGetRolesByLoginId_NoConfigMatch() {
         setup();
@@ -1780,8 +1810,6 @@ public void 
testGjUserToUserProfile_ConfigSuperUserOverridesRolesAndModules() {
         portalUser.setId(99L);
         portalUser.setLoginId("config-admin");
         session.setXXPortalUser(portalUser);
-        session.setUserAdmin(true);
-        session.setKeyAdmin(true);
         session.setSuperUser(true);
 
         RangerSecurityContext context = new RangerSecurityContext();
@@ -1827,10 +1855,9 @@ public void 
testGjUserToUserProfile_ConfigSuperUserOverridesRolesAndModules() {
         userMgr.gjUserToUserProfile(user, profile);
 
         
Assertions.assertTrue(profile.getUserRoleList().contains(RangerConstants.ROLE_SYS_ADMIN));
-        
Assertions.assertTrue(profile.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
-        Assertions.assertEquals(2, profile.getUserPermList().size());
+        
Assertions.assertFalse(profile.getUserRoleList().contains(RangerConstants.ROLE_KEY_ADMIN));
+        Assertions.assertEquals(1, profile.getUserPermList().size());
         Assertions.assertEquals(RangerConstants.MODULE_AUDIT, 
profile.getUserPermList().get(0).getModuleName());
-        Assertions.assertEquals(RangerConstants.MODULE_KEY_MANAGER, 
profile.getUserPermList().get(1).getModuleName());
 
         destroySession();
     }
@@ -1843,8 +1870,6 @@ public void 
testMapXXPortalUserToVXPortalUser_ConfigSuperUserPreservesProfileRol
         portalUser.setId(99L);
         portalUser.setLoginId("config-admin");
         session.setXXPortalUser(portalUser);
-        session.setUserAdmin(true);
-        session.setKeyAdmin(true);
         session.setSuperUser(true);
 
         RangerSecurityContext context = new RangerSecurityContext();
@@ -1887,13 +1912,73 @@ public void 
testMapXXPortalUserToVXPortalUser_ConfigSuperUserPreservesProfileRol
         VXPortalUser profile = userMgr.mapXXPortalUserToVXPortalUser(user, 
null);
 
         Assertions.assertEquals(
-                Arrays.asList(RangerConstants.ROLE_SYS_ADMIN, 
RangerConstants.ROLE_KEY_ADMIN),
+                Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
                 profile.getUserRoleList());
         
Assertions.assertFalse(profile.getUserRoleList().contains(RangerConstants.ROLE_USER));
 
         destroySession();
     }
 
+    @Test
+    public void 
testMapXXPortalUserToVXPortalUser_ConfigSuperUserKeepsOtherUserDbRoles() {
+        XXPortalUser keyAdminUser = configSuperUserSessionAndKeyAdminUser();
+
+        VXPortalUser profile = 
userMgr.mapXXPortalUserToVXPortalUser(keyAdminUser, null);
+
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN),
 profile.getUserRoleList());
+
+        destroySession();
+    }
+
+    @Test
+    public void testCheckAccess_ConfigSuperUserCannotAccessKeyAdminUser() {
+        XXPortalUser    keyAdminUser = configSuperUserSessionAndKeyAdminUser();
+        XXPortalUserDao userDao      = Mockito.mock(XXPortalUserDao.class);
+
+        Mockito.when(daoManager.getXXPortalUser()).thenReturn(userDao);
+        
Mockito.when(userDao.findByLoginId("keyadmin-user")).thenReturn(keyAdminUser);
+        
Mockito.when(restErrorUtil.createRESTException(HttpServletResponse.SC_FORBIDDEN,
 "Logged-In user is not allowed to access requested user data", 
true)).thenReturn(new WebApplicationException());
+
+        Assertions.assertThrows(WebApplicationException.class, () -> 
userMgr.checkAccess(keyAdminUser));
+
+        destroySession();
+    }
+
+    private XXPortalUser configSuperUserSessionAndKeyAdminUser() {
+        UserSessionBase session    = new UserSessionBase();
+        XXPortalUser    portalUser = new XXPortalUser();
+
+        portalUser.setId(99L);
+        portalUser.setLoginId("config-admin");
+        session.setXXPortalUser(portalUser);
+        session.setSuperUser(true);
+
+        RangerSecurityContext context = new RangerSecurityContext();
+        context.setUserSession(session);
+        RangerContextHolder.setSecurityContext(context);
+
+        XXPortalUser keyAdminUser = new XXPortalUser();
+        keyAdminUser.setId(100L);
+        keyAdminUser.setLoginId("keyadmin-user");
+        keyAdminUser.setUserSource(RangerCommonEnums.USER_APP);
+
+        XXPortalUserRole keyAdminRole = new XXPortalUserRole();
+        keyAdminRole.setUserRole(RangerConstants.ROLE_KEY_ADMIN);
+
+        XXPortalUserRoleDao  roleDao            = 
Mockito.mock(XXPortalUserRoleDao.class);
+        XXUserPermissionDao  userPermissionDao  = 
Mockito.mock(XXUserPermissionDao.class);
+        XXGroupPermissionDao groupPermissionDao = 
Mockito.mock(XXGroupPermissionDao.class);
+
+        Mockito.when(daoManager.getXXPortalUserRole()).thenReturn(roleDao);
+        
Mockito.when(roleDao.findByParentId(100L)).thenReturn(Collections.singletonList(keyAdminRole));
+        
Mockito.when(daoManager.getXXUserPermission()).thenReturn(userPermissionDao);
+        
Mockito.when(daoManager.getXXGroupPermission()).thenReturn(groupPermissionDao);
+        
Mockito.when(userPermissionDao.findByUserPermissionIdAndIsAllowed(100L)).thenReturn(Collections.emptyList());
+        
Mockito.when(groupPermissionDao.findbyVXPortalUserId(100L)).thenReturn(Collections.emptyList());
+
+        return keyAdminUser;
+    }
+
     @Test
     public void test31checkAccess() {
         setup();
diff --git 
a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java 
b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
index e98960850..e5ecf1d9f 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
@@ -4622,6 +4622,68 @@ public void test135updateXGroupUser_userNotFound() {
         });
     }
 
+    @Test
+    public void test136checkAccess_configSuperUserCanAccessSysAdminUser() {
+        setupConfigSuperUserSession();
+
+        VXUser requestedUser = new VXUser();
+        requestedUser.setId(2L);
+        
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN));
+
+        Assertions.assertDoesNotThrow(() -> 
xUserMgr.checkAccess(requestedUser));
+    }
+
+    @Test
+    public void test137checkAccess_configSuperUserCannotAccessKeyAdminUser() {
+        setupConfigSuperUserSession();
+
+        VXUser requestedUser = new VXUser();
+        requestedUser.setId(2L);
+        
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+        
Mockito.when(restErrorUtil.create403RESTException(Mockito.anyString())).thenReturn(new
 WebApplicationException());
+
+        Assertions.assertThrows(WebApplicationException.class, () -> 
xUserMgr.checkAccess(requestedUser));
+    }
+
+    @Test
+    public void 
test138checkAccess_configSuperUserCanAccessSelfWithKeyAdminDBRole() {
+        setupConfigSuperUserSession();
+
+        VXUser requestedUser = new VXUser();
+        requestedUser.setId(1L);
+        requestedUser.setName("config-admin");
+        
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+        Assertions.assertDoesNotThrow(() -> 
xUserMgr.checkAccess(requestedUser));
+    }
+
+    @Test
+    public void 
test139checkAccess_rangerusersyncConfigSuperUserCanAccessKeyAdminUser() {
+        setupConfigSuperUserSession();
+        
ContextUtil.getCurrentUserSession().getXXPortalUser().setLoginId("rangerusersync");
+
+        VXUser requestedUser = new VXUser();
+        requestedUser.setId(2L);
+        requestedUser.setName("keyadmin");
+        
requestedUser.setUserRoleList(Collections.singletonList(RangerConstants.ROLE_KEY_ADMIN));
+
+        Assertions.assertDoesNotThrow(() -> 
xUserMgr.checkAccess(requestedUser));
+    }
+
+    private void setupConfigSuperUserSession() {
+        RangerSecurityContext context = new RangerSecurityContext();
+        context.setUserSession(new UserSessionBase());
+        RangerContextHolder.setSecurityContext(context);
+
+        UserSessionBase currentUserSession = 
ContextUtil.getCurrentUserSession();
+        XXPortalUser    portalUser         = new XXPortalUser();
+        portalUser.setLoginId("config-admin");
+        portalUser.setId(1L);
+        currentUserSession.setXXPortalUser(portalUser);
+        currentUserSession.setSuperUser(true);
+    }
+
     private VXUser vxUser() {
         Collection<String> userRoleList = new ArrayList<>();
         userRoleList.add("ROLE_USER");
diff --git 
a/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
 
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
index 8293c718f..de28dd37e 100644
--- 
a/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
+++ 
b/security-admin/src/test/java/org/apache/ranger/common/TestRangerSuperUserConfig.java
@@ -24,7 +24,6 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -149,40 +148,14 @@ public void testIsSuperUser_BlankLoginId() {
     }
 
     @Test
-    public void testMergeConfigSuperUserRoles_ForAuthentication() {
-        List<String> merged = RangerSuperUserConfig.mergeConfigSuperUserRoles(
-                Collections.singletonList(RangerConstants.ROLE_USER), false);
+    public void testGetSuperUserRoles() {
+        List<String> roles = RangerSuperUserConfig.getSuperUserRoles();
 
-        Assertions.assertEquals(
-                Arrays.asList(
-                        RangerConstants.ROLE_SYS_ADMIN,
-                        RangerConstants.ROLE_KEY_ADMIN,
-                        RangerConstants.ROLE_USER),
-                merged);
-    }
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
 roles);
 
-    @Test
-    public void testMergeConfigSuperUserRoles_ForSession() {
-        List<String> merged = RangerSuperUserConfig.mergeConfigSuperUserRoles(
-                Collections.singletonList(RangerConstants.ROLE_ADMIN_AUDITOR),
-                true);
+        roles.add(RangerConstants.ROLE_USER);
 
-        Assertions.assertEquals(
-                Arrays.asList(
-                        RangerConstants.ROLE_SYS_ADMIN,
-                        RangerConstants.ROLE_KEY_ADMIN,
-                        RangerConstants.ROLE_USER,
-                        RangerConstants.ROLE_ADMIN_AUDITOR),
-                merged);
-    }
-
-    @Test
-    public void testGetConfigSuperUserProfileRoles() {
-        Assertions.assertEquals(
-                Arrays.asList(
-                        RangerConstants.ROLE_SYS_ADMIN,
-                        RangerConstants.ROLE_KEY_ADMIN),
-                RangerSuperUserConfig.getConfigSuperUserProfileRoles());
+        
Assertions.assertEquals(Collections.singletonList(RangerConstants.ROLE_SYS_ADMIN),
 RangerSuperUserConfig.getSuperUserRoles());
     }
 
     @Test
@@ -224,17 +197,6 @@ public void 
testIsEnabled_WhenWildcardConfiguredAsLiteralUser() {
         Assertions.assertTrue(RangerSuperUserConfig.isSuperUser("*", 
Collections.emptySet()));
     }
 
-    @Test
-    public void testMergeConfigSuperUserRoles_NullExistingRoles() {
-        List<String> merged = 
RangerSuperUserConfig.mergeConfigSuperUserRoles(null, false);
-
-        Assertions.assertEquals(
-                Arrays.asList(
-                        RangerConstants.ROLE_SYS_ADMIN,
-                        RangerConstants.ROLE_KEY_ADMIN),
-                merged);
-    }
-
     @Test
     public void testConfigReloadAfterResetForTests() {
         
PropertiesUtil.getPropertiesMap().put(RangerConstants.RANGER_ADMIN_SUPER_USERS, 
"alice");
diff --git 
a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java 
b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
index 76a1f3131..62c2d36e0 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
@@ -620,16 +620,19 @@ public void testGetAccessLogsForConfigSuperUser() {
         Mockito.when(searchUtil.extractInt(Mockito.any(), Mockito.any(), 
Mockito.anyString(), Mockito.anyString())).thenReturn(8);
         Mockito.when(searchUtil.extractDate(Mockito.any(), Mockito.any(), 
Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(new 
Date());
         Mockito.when(searchUtil.extractLong(Mockito.any(), Mockito.any(), 
Mockito.anyString(), Mockito.anyString())).thenReturn(8L);
-        Mockito.when(msBizUtil.isSuperUser()).thenReturn(true);
+        Mockito.when(msBizUtil.isKeyAdmin()).thenReturn(false);
+        Mockito.when(msBizUtil.isAuditKeyAdmin()).thenReturn(false);
+        Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
+        XXServiceDef xServiceDef = new XXServiceDef();
+        xServiceDef.setId(Id);
+        
Mockito.when(xxServiceDefDao.findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME)).thenReturn(xServiceDef);
         ArgumentCaptor<SearchCriteria> criteriaCaptor = 
ArgumentCaptor.forClass(SearchCriteria.class);
         
Mockito.when(assetMgr.getAccessLogs(criteriaCaptor.capture())).thenReturn(vXAccessAuditList);
         VXAccessAuditList expectedVXAccessAuditList = 
assetREST.getAccessLogs(request, null);
         Assertions.assertEquals(vXAccessAuditList, expectedVXAccessAuditList);
         
Assertions.assertFalse(criteriaCaptor.getValue().getParamList().containsKey("repoType"));
-        
Assertions.assertFalse(criteriaCaptor.getValue().getParamList().containsKey("-repoType"));
-        Mockito.verify(msBizUtil).isSuperUser();
-        Mockito.verify(msBizUtil, Mockito.never()).isKeyAdmin();
-        Mockito.verify(daoManager, Mockito.never()).getXXServiceDef();
+        Assertions.assertEquals(Id, 
criteriaCaptor.getValue().getParamList().get("-repoType"));
+        Mockito.verify(msBizUtil, Mockito.never()).isSuperUser();
         Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
     }
 

Reply via email to