From a899eae792897cb014b9291562f32f5786cfb1f4 Mon Sep 17 00:00:00 2001 From: yuxc <yuxc@vci-tech.com> Date: 星期四, 16 一月 2025 15:51:13 +0800 Subject: [PATCH] UI授权后,由于一个用户拥有多个角色问题,没有权限的角色可能会把有权限的角色数据替换,进行修改 --- Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java | 178 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 119 insertions(+), 59 deletions(-) diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java index 27f98b1..e989fdf 100644 --- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java +++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java @@ -10,27 +10,21 @@ import com.vci.pagemodel.*; import com.vci.starter.web.annotation.log.VciUnLog; import com.vci.starter.web.exception.VciBaseException; -import com.vci.starter.web.util.BeanUtilForVCI; -import com.vci.starter.web.util.LangBaseUtil; -import com.vci.starter.web.util.VciBaseUtil; -import com.vci.starter.web.util.VciDateUtil; +import com.vci.starter.web.util.*; +import com.vci.starter.web.util.Lcm.Func; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.web.enumpck.UIComponentDisplayTypeEnum; import com.vci.web.enumpck.UIComponentTypeEnum; import com.vci.web.enumpck.UIFieldTypeEnum; import com.vci.web.enumpck.UILayoutAreaTypeEnum; import com.vci.web.other.AllActionThreadLocal; -import com.vci.web.service.OsAttributeServiceI; -import com.vci.web.service.OsBtmServiceI; -import com.vci.web.service.UIEngineServiceI; -import com.vci.web.service.WebBoServiceI; +import com.vci.web.service.*; import com.vci.web.util.PlatformClientUtil; import com.vci.web.util.WebUtil; import com.vci.web.xmlmodel.UIComponentDefineXO; import com.vci.web.xmlmodel.UIComponentDetailXO; import com.vci.web.xmlmodel.UIComponentItemXO; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hdf.extractor.SEP; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -93,10 +87,10 @@ private OsAttributeServiceI attrService; /** - * 涓氬姟绫诲瀷鐨勬湇鍔� + * UI瀹氫箟绠$悊鏈嶅姟 */ @Autowired - private WebBoServiceI boService; + private UIManagerServiceI uiManagerServiceI; /** * 琛ㄥ崟鐨勫瓧娈电被鍨嬫槧灏� @@ -874,7 +868,7 @@ private List<UIContentVO> UIContentDO2VOs(Collection<PLUILayout> pageLayoutDefinations){ List<UIContentVO> contentVOS = new ArrayList<>(); Optional.ofNullable(pageLayoutDefinations).orElseGet(()->new ArrayList<PLUILayout>()).stream().forEach(pageLayout->{ - contentVOS.add(UIContentDO2VO(pageLayout,false)); + contentVOS.add(UIContentDO2VO(pageLayout,false,null)); }); if(!CollectionUtils.isEmpty(contentVOS)) { Map<String, List<UILayoutVO>> layoutMap = batchListLayoutByContent(contentVOS.stream().map(UIContentVO::getOid).collect(Collectors.toSet())); @@ -900,7 +894,7 @@ */ @VciUnLog @Override - public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail){ + public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail,Map<String, List<RoleRightVO>> roleRightMap){ UIContentVO contentVO = new UIContentVO(); if(pageLayoutDefination !=null){ contentVO.setOid(pageLayoutDefination.plOId); @@ -918,14 +912,16 @@ contentVO.setLastModifier(pageLayoutDefination.plModifyUser); if(queryDetail){ //鏌ヨ鍖呭惈鐨勫唴瀹� - List<UILayoutVO> layoutVOS = listLayoutByContent(contentVO.getOid()); + List<UILayoutVO> layoutVOS = null; + //鍒ゆ柇鏄惁鏍规嵁鏉冮檺杩斿洖 + layoutVOS = listLayoutByContent(contentVO.getOid(),roleRightMap); if(!CollectionUtils.isEmpty(layoutVOS)){ if(layoutVOS.size() == 1){ //鍙湁涓�涓尯鍩� UILayoutVO layoutVO = layoutVOS.get(0); List<UIComponentVO> componentVOs = layoutVO.getComponentVOs(); //绗竴涓綔涓篶enter - UIComponentVO firstCompVO = componentVOs.stream().min((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())).get(); + UIComponentVO firstCompVO = componentVOs.stream().min(Comparator.comparing(UIComponentVO::getOrderNum)).get(); List<UIComponentVO> southCompVO = componentVOs.stream().filter(s->!s.getOid().equals(firstCompVO.getOid())).collect(Collectors.toList()); UILayoutVO centerVO = new UILayoutVO(); @@ -1014,16 +1010,79 @@ // } /** - * 鑾峰彇鏌愪釜UI涓婁笅鏂囩殑鍖哄煙 + * 鑾峰彇鏌愪釜UI涓婁笅鏂囩殑鍖哄煙锛屾牴鎹潈闄愭帶鍒惰繑鍥� * @param pkContent UI涓婁笅鏂囩殑涓婚敭 * @return 涓婁笅鏂� */ - private List<UILayoutVO> listLayoutByContent(String pkContent){ + private List<UILayoutVO> listLayoutByContent(String pkContent,Map<String, List<RoleRightVO>> roleRightMap){ try { - return UILayoutDO2VOs(Arrays.stream(platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(pkContent)).collect(Collectors.toList()),true); + List<PLTabPage> tabPageList = Arrays.stream(platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(pkContent)).collect(Collectors.toList()); + //杩囨护鎺夋病鏈夎闂潈闄愮殑UI + tabPageList = this.filterTabPageByRoleRight(tabPageList,roleRightMap); + return UILayoutDO2VOs(tabPageList,true,roleRightMap); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } + } + + /** + * 鏍规嵁鏉冮檺闆嗗悎杩囨护鎺夋病鏈夎闂潈闄愮殑椤电鏁版嵁 + * @param tabPageList + * @param roleRightMap + */ + private List<PLTabPage> filterTabPageByRoleRight(List<PLTabPage> tabPageList, Map<String, List<RoleRightVO>> roleRightMap){ + if(Func.isEmpty(roleRightMap) || Func.isEmpty(tabPageList)){ + return tabPageList; + } + List<PLTabPage> filterList = new ArrayList<>(); + for (int i = 0; i < tabPageList.size(); i++) { + PLTabPage tabPage = tabPageList.get(i); + if(roleRightMap.containsKey(tabPage.plOId)){ + filterList.add(tabPage); + } + /*if(roleRightMap.containsKey(tabPage.plContextOId)) { + Long rightValue = roleRightMap.get(tabPage.plContextOId).getRightValue(); + int nodeValue = tabPage.plSeq; + if (nodeValue >= 0 && nodeValue <= 63) { + //杩涜浣嶄笌鎿嶄綔锛屽鏋滅浉绛夊垯琛ㄧず鍏锋湁褰撳墠鎿嶄綔鐨勬潈闄� + long preValue = (rightValue >> nodeValue) & 1; + if (preValue != 1) { + tabPageList.remove(tabPage); + } + } + }*/ + } + return filterList; + } + + /** + * 鏍规嵁鏉冮檺闆嗗悎杩囨护鎺夋病鏈夎闂潈闄愮殑椤甸潰瀹氫箟鏁版嵁 + * @param plPageDefinationList + * @param roleRightMap + */ + private List<PLPageDefination> filterPageDefByRoleRight(List<PLPageDefination> plPageDefinationList, Map<String, List<RoleRightVO>> roleRightMap){ + if(Func.isEmpty(roleRightMap) || Func.isEmpty(plPageDefinationList)){ + return plPageDefinationList; + } + List<PLPageDefination> filterList = new ArrayList<>(); + for (int i = 0; i < plPageDefinationList.size(); i++) { + PLPageDefination plPageDefination = plPageDefinationList.get(i); + if(roleRightMap.containsKey(plPageDefination.plOId)){ + filterList.add(plPageDefination); + } + /*if(roleRightMap.containsKey(plPageDefination.plTabPageOId)) { + Long rightValue = roleRightMap.get(plPageDefination.plTabPageOId).getRightValue(); + int nodeValue = plPageDefination.seq; + if (nodeValue >= 0 && nodeValue <= 63) { + //杩涜浣嶄笌鎿嶄綔锛屽鏋滅浉绛夊垯琛ㄧず鍏锋湁褰撳墠鎿嶄綔鐨勬潈闄� + long preValue = (rightValue >> nodeValue) & 1; + if (preValue != 1) { + plPageDefinationList.remove(plPageDefination); + } + } + }*/ + } + return filterList; } /** @@ -1077,7 +1136,7 @@ * @param pages 鍖哄煙鐨勬暟鎹璞� * @return 鏄剧ず瀵硅薄 */ - private List<UILayoutVO> UILayoutDO2VOs(Collection<PLTabPage> pages, boolean queryDetail){ + private List<UILayoutVO> UILayoutDO2VOs(Collection<PLTabPage> pages, boolean queryDetail, Map<String, List<RoleRightVO>> roleRightMap){ List<UILayoutVO> contentVOS = new ArrayList<>(); Map<String, OsAttributeVO> attributeVOMap; if(pages != null && pages.size() > 0){ @@ -1091,7 +1150,7 @@ attributeVOMap = null; } Optional.ofNullable(pages).orElseGet(()->new ArrayList<PLTabPage>()).stream().forEach(page->{ - UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail,attributeVOMap); + UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail,attributeVOMap,roleRightMap); if(layoutVO.isEnableStatus()) { contentVOS.add(layoutVO); } @@ -1115,7 +1174,7 @@ * @return 鍖哄煙鐨勬樉绀哄璞� */ @VciUnLog - private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap){ + private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){ UILayoutVO layoutVO = new UILayoutVO(); if(page !=null ){ layoutVO.setOid(page.plOId); @@ -1155,7 +1214,10 @@ if(queryDetail){ //鍗曚釜鐨勶紝鐩存帴鑾峰彇 try { - layoutVO.setComponentVOs(uiComponentDO2VOs(Arrays.stream(platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()),true,attributeVOMap)); + List<PLPageDefination> pageDefinationList = Arrays.stream(platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()); + pageDefinationList = this.filterPageDefByRoleRight(pageDefinationList,roleRightMap); + List<UIComponentVO> uiComponentVOS = uiComponentDO2VOs(pageDefinationList, true, attributeVOMap,roleRightMap); + layoutVO.setComponentVOs(uiComponentVOS); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } @@ -1163,6 +1225,7 @@ } return layoutVO; } + /** * 鏌ヨ鎵�鏈夌殑涓婁笅鏂囩殑鍖哄煙鐨勬槧灏� * @@ -1200,23 +1263,10 @@ return null; } try { - return uiComponentDO2VO(platformClientUtil.getUIService().getPLPageDefinationById(componentOid),true,attributeVOMap); + return uiComponentDO2VO(platformClientUtil.getUIService().getPLPageDefinationById(componentOid),true,attributeVOMap,null); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } - /*if(!QUERY_BY_CACHE){ - try { - return uiComponentDO2VO(platformClientUtil.getUIService().getPLPageDefinationById(componentOid),true,attributeVOMap); - } catch (PLException vciError) { - throw WebUtil.getVciBaseException(vciError); - } - }else{ - List<UIComponentVO> componentVOS = self.selectAllUIComponent(); - List<UIComponentVO> componentVOList = Optional.ofNullable(componentVOS).orElseGet(() -> new ArrayList<>()).stream().filter(s -> s.getOid().equalsIgnoreCase(componentOid)).collect(Collectors.toList()); - if(!CollectionUtils.isEmpty(componentVOList)){ - return componentVOList.get(0); - } - }*/ } /** @@ -1224,10 +1274,10 @@ * @param pages 鏁版嵁瀵硅薄 * @return 鏄剧ず瀵硅薄 */ - private List<UIComponentVO> uiComponentDO2VOs(Collection<com.vci.corba.portal.data.PLPageDefination> pages, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap){ + private List<UIComponentVO> uiComponentDO2VOs(Collection<PLPageDefination> pages, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){ List<UIComponentVO> componentVOS = new ArrayList<>(); pages.stream().forEach(page->{ - componentVOS.add(uiComponentDO2VO(page,queryDetail,attributeVOMap)); + componentVOS.add(uiComponentDO2VO(page,queryDetail,attributeVOMap,roleRightMap)); }); return componentVOS; } @@ -1238,7 +1288,7 @@ * @return 鏄剧ず瀵硅薄 */ @VciUnLog - private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail, Map<String, OsAttributeVO> attributeVOMap){ + private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail, Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){ UIComponentVO componentVO = new UIComponentVO(); if(page !=null){ componentVO.setOid(page.plOId); @@ -1379,8 +1429,8 @@ treeDefineVO.setBtmType(componentDefineXO.getShowType()); treeDefineVO.setLinkType(componentDefineXO.getLinkType()); treeDefineVO.setLoadType("1".equalsIgnoreCase(componentDefineXO.getExpandMode())?"node":"all"); - //TODO:杩欎釜灞炴�х幇鍦ㄧ敱閾炬帴绫诲瀷鏌ヨ鎺у埗锛屼笉鐢遍〉闈㈠畾涔夋帶鍒朵簡 - //treeDefineVO.setOrientation("positive".equalsIgnoreCase(componentDefineXO.getOrientation())?false:true); + //TODO:杩欎釜灞炴�х幇鍦ㄧ敱閾炬帴绫诲瀷鏌ヨ妯℃澘閰嶇疆涓婃帶鍒讹紝涓嶅湪椤甸潰瀹氫箟鎺у埗浜�,浣嗘槸涓轰簡鍏煎浠ュ墠鐨刄I瀹氫箟鎵�浠ラ渶瑕佽�冭檻淇濈暀 + treeDefineVO.setOrientation(componentDefineXO.getOrientation()); treeDefineVO.setShowImage("1".equalsIgnoreCase(componentDefineXO.getIsShowImage())?true:false); treeDefineVO.setRootContent(componentDefineXO.getRootContent()); treeDefineVO.setFieldSep(StringUtils.isBlank(componentDefineXO.getSeparator())?",":componentDefineXO.getSeparator()); @@ -1405,39 +1455,43 @@ } componentVO.setUiParseClass(componentDefineXO.getUIParser()); componentVO.setExtendAttr(componentDefineXO.getExtAttr()); - componentVO.setButtons(listButtonByComponent(componentVO.getOid())); + componentVO.setButtons(listButtonByComponent(componentVO.getOid(),roleRightMap)); } return componentVO; } /** - * 鑾峰彇鏌愪釜缁勪欢鐨勬寜閽� + * 鑾峰彇鏌愪釜缁勪欢鐨勬寜閽�(鏍规嵁鏉冮檺杩囨护) * @param pkComponent 缁勪欢鐨勪富閿� * @return 鎸夐挳鐨勪俊鎭� */ @Override - public List<UIButtonDefineVO> listButtonByComponent(String pkComponent){ + public List<UIButtonDefineVO> listButtonByComponent(String pkComponent, Map<String, List<RoleRightVO>> roleRightMap){ try { List<UIButtonDefineVO> buttonDefineVOS = buttonDO2VOs(Arrays.stream(platformClientUtil.getUIService().getPLTabButtonsByTableOId(pkComponent)).collect(Collectors.toSet())).stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList()); - - Map<String,RoleRightInfo> allRightRoleMap = new HashMap<>(); - RoleRightInfo[] bts = platformClientUtil.getFrameworkService().getRoleRightByUserName("bt"); - Map<String,Long> rightMap = new HashMap<String,Long>(); - for(RoleRightInfo obj:bts){ - allRightRoleMap.put(obj.funcId, obj); - rightMap.put(obj.funcId,obj.rightValue); + if(Func.isEmpty(roleRightMap)){ + roleRightMap = uiManagerServiceI.getRoleRightMap(null); } + //寰幆瀵规寜閽潈闄愯繘琛屽垽鏂紝娌℃湁鏉冮檺鐨勫皢绉婚櫎buttonDefineVOS瀵硅薄 Iterator<UIButtonDefineVO> buttonDefineVO = buttonDefineVOS.iterator(); while (buttonDefineVO.hasNext()){ UIButtonDefineVO buttonDefine = buttonDefineVO.next(); - if(rightMap.containsKey(buttonDefine.getPkComponent())) { - Long rightValue = rightMap.get(buttonDefine.getPkComponent()); + if(roleRightMap.containsKey(buttonDefine.getPkComponent())) { + List<Long> rightValues = roleRightMap.get(buttonDefine.getPkComponent()).stream() + .map(e -> e.getRightValue()).collect(Collectors.toList()); int nodeValue = buttonDefine.getOrderNum(); if (nodeValue >= 0 && nodeValue <= 63) { + boolean authFlag = false; //杩涜浣嶄笌鎿嶄綔锛屽鏋滅浉绛夊垯琛ㄧず鍏锋湁褰撳墠鎿嶄綔鐨勬潈闄� - long preValue = (rightValue >> nodeValue) & 1; - if (preValue != 1) { + for (Long rightValue : rightValues) { + long preValue = (rightValue >> nodeValue) & 1; + if (preValue == 1) { + authFlag = true; + break; + } + } + if(!authFlag){ buttonDefineVO.remove(); } } @@ -1469,7 +1523,7 @@ * @return 鏄剧ず瀵硅薄 */ @Override - public List<UIButtonDefineVO> buttonDO2VOs(Collection<com.vci.corba.portal.data.PLTabButton> buttons){ + public List<UIButtonDefineVO> buttonDO2VOs(Collection<PLTabButton> buttons){ List<UIButtonDefineVO> buttonDefineVOS = new ArrayList<>(); if(buttons != null && buttons.size() > 0){ // Map<String, UIActionVO> actionVOMap = self.selectAllActionMap(); @@ -1493,7 +1547,7 @@ * @return 鏄剧ず瀵硅薄 */ @Override - public UIButtonDefineVO buttonDO2VO(com.vci.corba.portal.data.PLTabButton button, Map<String, UIActionVO> actionVOMap) { + public UIButtonDefineVO buttonDO2VO(PLTabButton button, Map<String, UIActionVO> actionVOMap) { UIButtonDefineVO buttonVO = new UIButtonDefineVO(); // Map<String, UIActionVO> actionVOMap = ServiceProvider.getUIService().getAllPLAction(); if(button !=null){ @@ -1587,7 +1641,7 @@ * @return UI涓婁笅鏂囩殑淇℃伅 */ @Override - public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) { + public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) throws PLException { WebUtil.alertNotNull(btmType,"涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨�",id,"UI涓婁笅鏂囩殑缂栧彿"); PLUILayout[] obj = null; try { @@ -1595,6 +1649,10 @@ } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } + // 1銆佹牴鎹綋鍓嶈鑹插垽鏂槸绠$悊浜哄憳杩樻槸鏅�氱敤鎴凤紙姝e父鏉ヨ鍙湁鏅�氱敤鎴锋墠浼氱敤鍒拌鏌ヨ鎺ュ彛锛� + Map<String, List<RoleRightVO>> roleRightMap = uiManagerServiceI.getRoleRightMap(null); + // 2銆佹寜鐓у綋鍓嶇櫥褰曠敤鎴锋煡璇㈡潈闄愶紙鍔熻兘鏉冮檺鍜孶I鎺堟潈鐨勬巿鏉冧俊鎭兘鏄斁鍦ㄥ悓涓�寮犺〃閲岀殑锛� + // 3銆佹壘鍑哄綋鍓嶈鏌ヨ鐨刄I涓婁笅鏂� PLUILayout context = null; for (int i = 0; i < obj.length; i++) { if (obj[i].plCode.equals(id)) { @@ -1602,7 +1660,9 @@ break; } } - return UIContentDO2VO(context,true); + // 4銆佹瘡涓�涓彍鍗曟煡璇㈢殑閮芥槸涓�涓猆I涓婁笅鏂囷紝鎵�浠I涓婁笅鏂囨槸鏈夊姛鑳芥巿鏉冩帶鍒剁殑锛屽彧闇�瑕佹帶鍒跺悗闈㈢殑椤电銆侀〉闈€�佹寜閽殑鏉冮檺銆� + return UIContentDO2VO(context, true,roleRightMap); } + } -- Gitblit v1.9.3