Skip to content

Commit 5d07d12

Browse files
Mahesh Bandalpradeepagrawal8184
authored andcommitted
RANGER-3551: Analyze & optimize module permissions related API (Part-1)
Created new API /permissionlist to reduce response object size of the permission listing page. Also, optimized code for GET API /permission/{id} Signed-off-by: pradeep <[email protected]>
1 parent 09ec4d9 commit 5d07d12

File tree

18 files changed

+384
-196
lines changed

18 files changed

+384
-196
lines changed

security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,44 +1126,25 @@ public VXModuleDef updateXModuleDefPermission(VXModuleDef vXModuleDef) {
11261126
if(!StringUtils.equals(xModuleDef.getModule(), vXModuleDef.getModule())) {
11271127
throw restErrorUtil.createRESTException("Module name change is not allowed!", MessageEnums.DATA_NOT_UPDATABLE);
11281128
}
1129-
VXModuleDef vModuleDefPopulateOld = xModuleDefService.populateViewBean(xModuleDef);
11301129

1131-
List<XXGroupPermission> xgroupPermissionList = daoManager.getXXGroupPermission().findByModuleId(vXModuleDef.getId(), true);
1132-
Map<Long, XXGroup> xXGroupMap=xGroupService.getXXGroupIdXXGroupMap();
1133-
if(xXGroupMap==null || xXGroupMap.isEmpty()){
1134-
for (XXGroupPermission xGrpPerm : xgroupPermissionList) {
1135-
VXGroupPermission vXGrpPerm = xGroupPermissionService.populateViewBean(xGrpPerm);
1136-
groupPermListOld.add(vXGrpPerm);
1137-
}
1138-
}else{
1139-
groupPermListOld=xGroupPermissionService.getPopulatedVXGroupPermissionList(xgroupPermissionList,xXGroupMap,vModuleDefPopulateOld);
1140-
}
1141-
vModuleDefPopulateOld.setGroupPermList(groupPermListOld);
1130+
Map<Long, Object[]> xXPortalUserIdXXUserMap = xUserService.getXXPortalUserIdXXUserNameMap();
1131+
Map<Long, String> xXGroupMap = xGroupService.getXXGroupIdNameMap();
1132+
VXModuleDef vModuleDefPopulateOld = xModuleDefService.populateViewBean(xModuleDef, xXPortalUserIdXXUserMap, xXGroupMap, true);
1133+
groupPermListOld = vModuleDefPopulateOld.getGroupPermList();
1134+
userPermListOld = vModuleDefPopulateOld.getUserPermList();
1135+
Map<Long, VXUserPermission> userPermMapOld = xUserPermissionService.convertVListToVMap(userPermListOld);
1136+
Map<Long, VXGroupPermission> groupPermMapOld = xGroupPermissionService.convertVListToVMap(groupPermListOld);
11421137

1143-
List<XXUserPermission> xuserPermissionList = daoManager.getXXUserPermission().findByModuleId(vXModuleDef.getId(), true);
1144-
Map<Long, XXUser> xXPortalUserIdXXUserMap=xUserService.getXXPortalUserIdXXUserMap();
1145-
if(xXPortalUserIdXXUserMap==null || xXPortalUserIdXXUserMap.isEmpty()){
1146-
for (XXUserPermission xUserPerm : xuserPermissionList) {
1147-
VXUserPermission vUserPerm = xUserPermissionService.populateViewBean(xUserPerm);
1148-
userPermListOld.add(vUserPerm);
1149-
}
1150-
}else{
1151-
userPermListOld=xUserPermissionService.getPopulatedVXUserPermissionList(xuserPermissionList,xXPortalUserIdXXUserMap,vModuleDefPopulateOld);
1152-
}
1153-
vModuleDefPopulateOld.setUserPermList(userPermListOld);
1154-
1155-
if (groupPermListOld != null && groupPermListNew != null) {
1138+
if (groupPermMapOld != null && groupPermListNew != null) {
11561139
for (VXGroupPermission newVXGroupPerm : groupPermListNew) {
1157-
11581140
boolean isExist = false;
1159-
1160-
for (VXGroupPermission oldVXGroupPerm : groupPermListOld) {
1161-
if (newVXGroupPerm.getModuleId().equals(oldVXGroupPerm.getModuleId()) && newVXGroupPerm.getGroupId().equals(oldVXGroupPerm.getGroupId())) {
1162-
if (!newVXGroupPerm.getIsAllowed().equals(oldVXGroupPerm.getIsAllowed())) {
1163-
oldVXGroupPerm.setIsAllowed(newVXGroupPerm.getIsAllowed());
1164-
oldVXGroupPerm = this.updateXGroupPermission(oldVXGroupPerm);
1165-
}
1166-
isExist = true;
1141+
VXGroupPermission oldVXGroupPerm = groupPermMapOld.get(newVXGroupPerm.getGroupId());
1142+
if (oldVXGroupPerm != null && newVXGroupPerm.getGroupId().equals(oldVXGroupPerm.getGroupId())
1143+
&& newVXGroupPerm.getModuleId().equals(oldVXGroupPerm.getModuleId())) {
1144+
isExist = true;
1145+
if (!newVXGroupPerm.getIsAllowed().equals(oldVXGroupPerm.getIsAllowed())) {
1146+
oldVXGroupPerm.setIsAllowed(newVXGroupPerm.getIsAllowed());
1147+
oldVXGroupPerm = this.updateXGroupPermission(oldVXGroupPerm);
11671148
}
11681149
}
11691150
if (!isExist) {
@@ -1172,17 +1153,17 @@ public VXModuleDef updateXModuleDefPermission(VXModuleDef vXModuleDef) {
11721153
}
11731154
}
11741155

1175-
if (userPermListOld != null && userPermListNew != null) {
1156+
if (userPermMapOld != null && userPermListNew != null) {
11761157
for (VXUserPermission newVXUserPerm : userPermListNew) {
11771158

11781159
boolean isExist = false;
1179-
for (VXUserPermission oldVXUserPerm : userPermListOld) {
1180-
if (newVXUserPerm.getModuleId().equals(oldVXUserPerm.getModuleId()) && newVXUserPerm.getUserId().equals(oldVXUserPerm.getUserId())) {
1181-
if (!newVXUserPerm.getIsAllowed().equals(oldVXUserPerm.getIsAllowed())) {
1182-
oldVXUserPerm.setIsAllowed(newVXUserPerm.getIsAllowed());
1183-
oldVXUserPerm = this.updateXUserPermission(oldVXUserPerm);
1184-
}
1185-
isExist = true;
1160+
VXUserPermission oldVXUserPerm = userPermMapOld.get(newVXUserPerm.getUserId());
1161+
if (oldVXUserPerm != null && newVXUserPerm.getUserId().equals(oldVXUserPerm.getUserId())
1162+
&& newVXUserPerm.getModuleId().equals(oldVXUserPerm.getModuleId())) {
1163+
isExist = true;
1164+
if (!newVXUserPerm.getIsAllowed().equals(oldVXUserPerm.getIsAllowed())) {
1165+
oldVXUserPerm.setIsAllowed(newVXUserPerm.getIsAllowed());
1166+
oldVXUserPerm = this.updateXUserPermission(oldVXUserPerm);
11861167
}
11871168
}
11881169
if (!isExist) {

security-admin/src/main/java/org/apache/ranger/biz/XUserMgrBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.ranger.view.VXPermMap;
4646
import org.apache.ranger.view.VXPermMapList;
4747
import org.apache.ranger.view.VXUser;
48+
import org.apache.ranger.view.VXModulePermissionList;
4849
import org.apache.ranger.view.VXUserList;
4950
import org.apache.ranger.view.VXUserPermissionList;
5051
import org.springframework.beans.factory.annotation.Autowired;
@@ -280,6 +281,9 @@ public VXLong getXAuditMapSearchCount(SearchCriteria searchCriteria) {
280281
public VXModuleDefList searchXModuleDef(SearchCriteria searchCriteria) {
281282
return xModuleDefService.searchModuleDef(searchCriteria);
282283
}
284+
public VXModulePermissionList searchXModuleDefList(SearchCriteria searchCriteria) {
285+
return xModuleDefService.searchModuleDefList(searchCriteria);
286+
}
283287

284288
public VXUserPermissionList searchXUserPermission(SearchCriteria searchCriteria) {
285289
return xUserPermissionService.searchXUserPermission(searchCriteria);

security-admin/src/main/java/org/apache/ranger/common/SearchCriteria.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.List;
2929
import java.util.Set;
3030

31-
import org.apache.ranger.biz.RangerBizUtil;
3231
import org.slf4j.Logger;
3332
import org.slf4j.LoggerFactory;
3433

@@ -188,12 +187,12 @@ public boolean isDistinct() {
188187
*/
189188
public void setDistinct(boolean isDistinct) {
190189

191-
int dbFlavor = RangerBizUtil.getDBFlavor();
192-
if (isDistinct && dbFlavor == AppConstants.DB_FLAVOR_ORACLE) {
193-
isDistinct = false;
194-
logger.debug("Database flavor is `ORACLE` so ignoring DISTINCT "
195-
+ "clause from select statement.");
196-
}
190+
// int dbFlavor = RangerBizUtil.getDBFlavor();
191+
// if (isDistinct && dbFlavor == AppConstants.DB_FLAVOR_ORACLE) {
192+
// isDistinct = false;
193+
// logger.debug("Database flavor is `ORACLE` so ignoring DISTINCT "
194+
// + "clause from select statement.");
195+
// }
197196
this.isDistinct = isDistinct;
198197
}
199198

security-admin/src/main/java/org/apache/ranger/db/XXGroupPermissionDao.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ public List<XXGroupPermission> findByModuleId(Long moduleId,
4545
if (isUpdate) {
4646
return getEntityManager()
4747
.createNamedQuery(
48-
"XXGroupPermissionUpdate.findByModuleId",
48+
"XXGroupPermissionUpdates.findByModuleId",
4949
XXGroupPermission.class)
5050
.setParameter("moduleId", moduleId).getResultList();
5151
}
5252
return getEntityManager()
5353
.createNamedQuery(
54-
"XXGroupPermissionUpdates.findByModuleId",
54+
"XXGroupPermission.findByModuleId",
5555
XXGroupPermission.class)
5656
.setParameter("moduleId", moduleId)
5757
.setParameter("isAllowed", RangerCommonEnums.IS_ALLOWED)
@@ -131,4 +131,19 @@ public void deleteByModuleId(Long moduleId) {
131131
}
132132
}
133133

134+
public List<String> findModuleGroupsByModuleId(Long moduleId) {
135+
if (moduleId != null) {
136+
try {
137+
return getEntityManager().createNamedQuery("XXGroupPermission.findModuleGroupsByModuleId", String.class)
138+
.setParameter("moduleId", moduleId)
139+
.setParameter("isAllowed",RangerCommonEnums.IS_ALLOWED)
140+
.getResultList();
141+
} catch (Exception e) {
142+
logger.debug(e.getMessage());
143+
}
144+
} else {
145+
logger.debug("ModuleId not provided.");
146+
}
147+
return null;
148+
}
134149
}

security-admin/src/main/java/org/apache/ranger/db/XXUserPermissionDao.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,21 @@ public void deleteByModuleId(Long moduleId) {
132132
logger.debug("ModuleId not provided.");
133133
}
134134
}
135+
136+
@SuppressWarnings("unchecked")
137+
public List<String> findModuleUsersByModuleId(Long moduleId) {
138+
if (moduleId != null) {
139+
try {
140+
return getEntityManager().createNamedQuery("XXUserPermission.findModuleUsersByModuleId", String.class)
141+
.setParameter("moduleId", moduleId)
142+
.setParameter("isAllowed",RangerCommonEnums.IS_ALLOWED)
143+
.getResultList();
144+
} catch (Exception e) {
145+
logger.debug(e.getMessage());
146+
}
147+
} else {
148+
logger.debug("ModuleId not provided.");
149+
}
150+
return null;
151+
}
135152
}

security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,27 @@ public VXModuleDefList searchXModuleDef(@Context HttpServletRequest request) {
977977
return xUserMgr.searchXModuleDef(searchCriteria);
978978
}
979979

980+
@GET
981+
@Path("/permissionlist")
982+
@Produces({ "application/xml", "application/json" })
983+
@PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + RangerAPIList.SEARCH_X_MODULE_DEF + "\")")
984+
public VXModulePermissionList searchXModuleDefList(@Context HttpServletRequest request) {
985+
SearchCriteria searchCriteria = searchUtil.extractCommonCriterias(
986+
request, xModuleDefService.sortFields);
987+
988+
searchUtil.extractString(request, searchCriteria, "module",
989+
"modulename", null);
990+
991+
searchUtil.extractString(request, searchCriteria, "moduleDefList",
992+
"id", null);
993+
searchUtil.extractString(request, searchCriteria, "userName",
994+
"userName", null);
995+
searchUtil.extractString(request, searchCriteria, "groupName",
996+
"groupName", null);
997+
998+
return xUserMgr.searchXModuleDefList(searchCriteria);
999+
}
1000+
9801001
@GET
9811002
@Path("/permission/count")
9821003
@Produces({ "application/xml", "application/json" })

security-admin/src/main/java/org/apache/ranger/service/AbstractBaseResourceService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,4 +821,15 @@ public void setSortClause(SearchCriteria searchCriteria,
821821

822822
}
823823
}
824+
825+
public Map<Long,V> convertVListToVMap(List<V> vObjList) {
826+
Map<Long,V> ret = new HashMap<Long,V>();
827+
if (vObjList == null) {
828+
return ret;
829+
}
830+
for (V vObj : vObjList) {
831+
ret.put(vObj.getId(), vObj);
832+
}
833+
return ret;
834+
}
824835
}

security-admin/src/main/java/org/apache/ranger/service/XGroupPermissionService.java

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.ranger.service;
1919

2020
import java.util.ArrayList;
21+
import java.util.HashMap;
2122
import java.util.List;
2223
import java.util.Map;
2324

@@ -76,28 +77,7 @@ public VXGroupPermission populateViewBean(XXGroupPermission xObj) {
7677
return vObj;
7778
}
7879

79-
public List<VXGroupPermission> getPopulatedVXGroupPermissionList(List<XXGroupPermission> xgroupPermissionList,Map<Long, XXGroup> xXGroupMap,VXModuleDef vModuleDef){
80-
List<VXGroupPermission> vXGroupPermissionList = new ArrayList<VXGroupPermission>();
81-
XXGroup xXGroup=null;
82-
for(XXGroupPermission xgroupPermission:xgroupPermissionList){
83-
if(xXGroupMap.containsKey(xgroupPermission.getGroupId())){
84-
xXGroup =xXGroupMap.get(xgroupPermission.getGroupId());
85-
VXGroupPermission vXGrpPerm=new VXGroupPermission();
86-
vXGrpPerm.setId(xgroupPermission.getId());
87-
vXGrpPerm.setGroupId(xgroupPermission.getGroupId());
88-
vXGrpPerm.setModuleId(xgroupPermission.getModuleId());
89-
vXGrpPerm.setIsAllowed(xgroupPermission.getIsAllowed());
90-
vXGrpPerm.setCreateDate(xgroupPermission.getCreateTime());
91-
vXGrpPerm.setUpdateDate(xgroupPermission.getUpdateTime());
92-
vXGrpPerm.setGroupName(xXGroup.getName());
93-
vXGrpPerm.setModuleName(vModuleDef.getModule());
94-
vXGroupPermissionList.add(vXGrpPerm);
95-
}
96-
}
97-
return vXGroupPermissionList;
98-
}
99-
100-
public List<VXGroupPermission> getPopulatedVXGroupPermissionListNew(List<XXGroupPermission> xgroupPermissionList,
80+
public List<VXGroupPermission> getPopulatedVXGroupPermissionList(List<XXGroupPermission> xgroupPermissionList,
10181
Map<Long, String> xXGroupMap, VXModuleDef vModuleDef) {
10282
List<VXGroupPermission> vXGroupPermissionList = new ArrayList<VXGroupPermission>();
10383
for (XXGroupPermission xgroupPermission : xgroupPermissionList) {
@@ -116,4 +96,16 @@ public List<VXGroupPermission> getPopulatedVXGroupPermissionListNew(List<XXGroup
11696
}
11797
return vXGroupPermissionList;
11898
}
99+
100+
@Override
101+
public Map<Long, VXGroupPermission> convertVListToVMap(List<VXGroupPermission> vObjList) {
102+
Map<Long, VXGroupPermission> ret = new HashMap<Long, VXGroupPermission>();
103+
if (vObjList == null) {
104+
return ret;
105+
}
106+
for (VXGroupPermission vObj : vObjList) {
107+
ret.put(vObj.getGroupId(), vObj);
108+
}
109+
return ret;
110+
}
119111
}

0 commit comments

Comments
 (0)