From 245b5dc200d6a40840a78c4a0889cdc5fdc375fb Mon Sep 17 00:00:00 2001 From: yunyezhang-work Date: Thu, 20 Nov 2025 00:43:45 +0800 Subject: [PATCH] Support export policies in a segmented manner --- .../ranger/plugin/util/SearchFilter.java | 20 ++++++++ .../ranger/common/RangerSearchUtil.java | 17 +++++++ .../org/apache/ranger/rest/ServiceREST.java | 50 +++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java index c5f13b5303..940e241c43 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java @@ -48,6 +48,8 @@ public class SearchFilter { public static final String CREATE_TIME = "createTime"; // sort public static final String UPDATE_TIME = "updateTime"; // sort public static final String START_INDEX = "startIndex"; + public static final String BEGIN_INDEX = "beginIndex"; + public static final String OFFSET_INDEX = "offsetIndex"; public static final String PAGE_SIZE = "pageSize"; public static final String SORT_BY = "sortBy"; public static final String RESOURCE_SIGNATURE = "resourceSignature:"; // search @@ -98,6 +100,8 @@ public class SearchFilter { private Map params; private int startIndex; private int maxRows = Integer.MAX_VALUE; + private int beginIndex = -1; + private int offsetIndex = -1; private boolean getCount = true; private String sortBy; private String sortType; @@ -182,6 +186,22 @@ public void setStartIndex(int startIndex) { this.startIndex = startIndex; } + public int getBeginIndex() { + return beginIndex; + } + + public void setBeginIndex(int beginIndex) { + this.beginIndex = beginIndex; + } + + public int getOffsetIndex() { + return offsetIndex; + } + + public void setOffsetIndex(int offsetIndex) { + this.offsetIndex = offsetIndex; + } + public int getMaxRows() { return maxRows; } diff --git a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java index 8030fe7a4c..89038be0e9 100644 --- a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java +++ b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java @@ -175,13 +175,30 @@ public SearchFilter extractCommonCriteriasForFilter(HttpServletRequest request, "Invalid value for parameter startIndex", MessageEnums.INVALID_INPUT_DATA, null, SearchFilter.START_INDEX); startIndex = startIndex < 0 ? 0 : startIndex; + logger.info("==> setStartIndex=" + startIndex); ret.setStartIndex(startIndex); int pageSize = restErrorUtil.parseInt(request.getParameter(SearchFilter.PAGE_SIZE), configUtil.getDefaultMaxRows(), "Invalid value for parameter pageSize", MessageEnums.INVALID_INPUT_DATA, null, SearchFilter.PAGE_SIZE); + logger.info("==> setMaxRows=" + pageSize); + logger.info("==> DefaultMaxRows=" + configUtil.getDefaultMaxRows()); ret.setMaxRows(validatePageSize(pageSize)); + int beginIndex = restErrorUtil.parseInt(request.getParameter(SearchFilter.BEGIN_INDEX), 0, + "Invalid value for parameter beginIndex", MessageEnums.INVALID_INPUT_DATA, null, + SearchFilter.BEGIN_INDEX); + beginIndex = beginIndex < 0 ? startIndex : beginIndex; + logger.info("==> setBeginIndex=" + beginIndex); + ret.setBeginIndex(beginIndex); + + int offsetSize = restErrorUtil.parseInt(request.getParameter(SearchFilter.OFFSET_INDEX), 0, + "Invalid value for parameter offset", MessageEnums.INVALID_INPUT_DATA, null, + SearchFilter.OFFSET_INDEX); + logger.info("==> setOffsetIndex=" + offsetSize); + offsetSize = offsetSize < 0 ? pageSize : offsetSize; + ret.setOffsetIndex(offsetSize); + ret.setGetCount(restErrorUtil.parseBoolean(request.getParameter("getCount"), true)); String sortBy = restErrorUtil.validateString(request.getParameter(SearchFilter.SORT_BY), StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortBy", MessageEnums.INVALID_INPUT_DATA, 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 b5c83f58bc..991a46a675 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 @@ -2604,6 +2604,8 @@ private List getAllFilteredPolicyList(SearchFilter filter, List serviceTypeList = null; List serviceNameInServiceTypeList = new ArrayList(); boolean isServiceExists = false; + int begin = -1; + int offset = -1; if (request.getParameter(PARAM_SERVICE_NAME) != null){ serviceNames = request.getParameter(PARAM_SERVICE_NAME); @@ -2623,6 +2625,9 @@ private List getAllFilteredPolicyList(SearchFilter filter, List policyListByServiceName = new ArrayList(); if (filter != null) { + begin = filter.getBeginIndex(); + offset = filter.getOffsetIndex(); + LOG.info("==> beginIndex: " + begin + " offsetIndex: " + offset); filter.setStartIndex(0); filter.setMaxRows(Integer.MAX_VALUE); @@ -2690,6 +2695,12 @@ private List getAllFilteredPolicyList(SearchFilter filter, policyLists.addAll(orderedPolicies.values()); } } + LOG.info("<==policyLists size:" + policyLists.size()); + + if(begin>=0 && offset >0) { + policyLists = cutRangerPolicyList(policyLists, filter); + LOG.info("<==policyLists size after cut:" + policyLists.size()); + } return policyLists; } @@ -3889,6 +3900,45 @@ private RangerPolicyList toRangerPolicyList(List policyList, Searc return ret; } + private List cutRangerPolicyList(List policyList, SearchFilter filter) { + List retList = null; + if (CollectionUtils.isNotEmpty(policyList)) { + int totalCount = policyList.size(); + int startIndex = filter.getBeginIndex(); + int pageSize = filter.getOffsetIndex(); + int toIndex = Math.min(startIndex + pageSize, totalCount); + LOG.info("==>totalCount: " + totalCount + " startIndex: " + startIndex + " pageSize: " +pageSize + " toIndex: " + toIndex); + String sortType = filter.getSortType(); + String sortBy = filter.getSortBy(); + + if (StringUtils.isNotEmpty(sortBy) && StringUtils.isNotEmpty(sortType)) { + // By default policyList is sorted by policyId in asc order, So handling only desc case. + if (SearchFilter.POLICY_ID.equalsIgnoreCase(sortBy)) { + if (SORT_ORDER.DESC.name().equalsIgnoreCase(sortType)) { + policyList.sort(this.getPolicyComparator(sortBy, sortType)); + } + } else if (SearchFilter.POLICY_NAME.equalsIgnoreCase(sortBy)) { + if (SORT_ORDER.ASC.name().equalsIgnoreCase(sortType)) { + policyList.sort(this.getPolicyComparator(sortBy, sortType)); + } else if (SORT_ORDER.DESC.name().equalsIgnoreCase(sortType)) { + policyList.sort(this.getPolicyComparator(sortBy, sortType)); + } else { + LOG.info("Invalid or Unsupported sortType : " + sortType); + } + } else { + LOG.info("Invalid or Unsupported sortBy property : " + sortBy); + } + } + + retList = new ArrayList(); + for (int i = startIndex; i < toIndex; i++) { + retList.add(policyList.get(i)); + } + + } + return retList; + } + private Comparator getPolicyComparator(String sortBy, String sortType) { Comparator rangerPolComparator = (RangerPolicy me, RangerPolicy other) -> { int ret = 0;