From 8e61d2eaee7feb3a3feadf5a12d63872b2f20eeb Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 3 Jun 2021 14:01:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=95=B4=E5=90=88=E5=88=B0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AuthUserServiceImpl.java | 38 ++++++++++---- .../dataease/base/mapper/ext/AuthMapper.java | 3 ++ .../dataease/base/mapper/ext/AuthMapper.xml | 51 +++++++++++++------ .../mapper/ext/ExtPluginSysMenuMapper.java | 15 ++++++ .../mapper/ext/ExtPluginSysMenuMapper.xml | 17 +++++++ .../base/mapper/ext/ExtSysAuthMapper.java | 4 +- .../base/mapper/ext/ExtSysAuthMapper.xml | 18 +++---- .../base/mapper/ext/ExtVAuthModelMapper.java | 1 + .../base/mapper/ext/ExtVAuthModelMapper.xml | 8 +-- .../commons/constants/SystemConstants.java | 5 ++ .../controller/sys/SysAuthController.java | 3 +- .../io/dataease/dto/SysAuthDetailDTO.java | 20 ++++++++ .../dataease/service/sys/SysAuthService.java | 50 +++++++++--------- 13 files changed, 167 insertions(+), 66 deletions(-) create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.xml create mode 100644 backend/src/main/java/io/dataease/dto/SysAuthDetailDTO.java diff --git a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java index fd9dada411..bf468686b7 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java @@ -2,8 +2,11 @@ package io.dataease.auth.service.impl; import io.dataease.auth.api.dto.CurrentRoleDto; import io.dataease.auth.entity.SysUserEntity; +import io.dataease.base.domain.SysUser; +import io.dataease.base.mapper.SysUserMapper; import io.dataease.base.mapper.ext.AuthMapper; import io.dataease.auth.service.AuthUserService; +import io.dataease.base.mapper.ext.ExtPluginSysMenuMapper; import io.dataease.commons.constants.AuthConstants; import io.dataease.plugins.common.dto.PluginSysMenu; import io.dataease.plugins.util.PluginUtils; @@ -13,8 +16,12 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @Service @@ -23,6 +30,10 @@ public class AuthUserServiceImpl implements AuthUserService { @Resource private AuthMapper authMapper; + @Resource + private SysUserMapper sysUserMapper; + @Resource + private ExtPluginSysMenuMapper extPluginSysMenuMapper; /** * 此处需被F2CRealm登录认证调用 也就是说每次请求都会被调用 所以最好加上缓存 @@ -53,16 +64,16 @@ public class AuthUserServiceImpl implements AuthUserService { @Cacheable(value = AuthConstants.USER_PERMISSION_CACHE_NAME, key = "'user' + #userId" ) @Override public List permissions(Long userId){ - List permissions = authMapper.permissions(userId); - List pluginSysMenus = PluginUtils.pluginMenus(); - if (CollectionUtils.isNotEmpty(pluginSysMenus)) { - List menuIds = authMapper.userMenuIds(userId); - List pluginPermissions = pluginSysMenus.stream(). - filter(sysMenu -> menuIds.contains(sysMenu.getMenuId())) - .map(menu -> menu.getPermission()).collect(Collectors.toList()); - permissions.addAll(pluginPermissions); + // 用户登录获取菜单权限时同时更新插件菜单表 + this.syncPluginMenu(); + List permissions; + SysUser sysUser = sysUserMapper.selectByPrimaryKey(userId); + if(sysUser.getIsAdmin()!=null&&sysUser.getIsAdmin()){ + permissions = authMapper.permissionsAll(); + }else{ + permissions = authMapper.permissions(userId); } - return permissions.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList()); + return Optional.ofNullable(permissions).orElse(new ArrayList<>()).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList()); } /** @@ -90,4 +101,13 @@ public class AuthUserServiceImpl implements AuthUserService { public void clearCache(Long userId) { } + + @Transactional + public void syncPluginMenu() { + List pluginSysMenuList = PluginUtils.pluginMenus(); + extPluginSysMenuMapper.deletePluginMenu(); + if(CollectionUtils.isNotEmpty(pluginSysMenuList)){ + extPluginSysMenuMapper.savePluginMenu(pluginSysMenuList); + } + } } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java index 00014f651a..d082a0faea 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java @@ -16,6 +16,8 @@ public interface AuthMapper { List permissions(@Param("userId") Long userId); + List permissionsAll(); + List userMenuIds(@Param("userId") Long userId); @@ -25,4 +27,5 @@ public interface AuthMapper { List roles(@Param("userId") Long userId); + } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml index 155f9033c2..981dfc5c93 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml @@ -4,19 +4,19 @@ - - - - - - - - + + + + + + + + - + - + @@ -34,12 +34,21 @@ where sur.user_id = #{userId} - + SELECT + sys_menu.permission + FROM + ( SELECT GET_V_AUTH_MODEL_ID_P_USE ( #{userId}, 'menu' ) cids ) t, + sys_menu + WHERE + FIND_IN_SET( sys_menu.menu_id, cids ) UNION ALL + SELECT + plugin_sys_menu.permission + FROM + ( SELECT GET_V_AUTH_MODEL_ID_P_USE ( #{userId}, 'menu' ) cids ) t, + plugin_sys_menu + WHERE + FIND_IN_SET( plugin_sys_menu.menu_id, cids ) + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.java new file mode 100644 index 0000000000..9c71ad3c29 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.java @@ -0,0 +1,15 @@ +package io.dataease.base.mapper.ext; + +import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.controller.sys.request.SimpleTreeNode; +import io.dataease.plugins.common.dto.PluginSysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ExtPluginSysMenuMapper { + + void savePluginMenu(@Param("menuList") List menuList); + + void deletePluginMenu(); +} diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.xml new file mode 100644 index 0000000000..68dbb73c43 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPluginSysMenuMapper.xml @@ -0,0 +1,17 @@ + + + + + + delete from plugin_sys_menu + + + + INSERT INTO `plugin_sys_menu` ( menu_id, title, pid, sub_count, permission, hidden ) VALUES + + (#{menu.menuId},#{menu.title},#{menu.pid},#{menu.subCount},#{menu.permission},#{menu.hidden}) + + + + + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.java index 04afa38bcc..f196f0e581 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.java @@ -1,13 +1,13 @@ package io.dataease.base.mapper.ext; import io.dataease.controller.request.SysAuthRequest; -import io.dataease.dto.SysAuthDTO; +import io.dataease.dto.SysAuthDetailDTO; import org.apache.ibatis.annotations.Param; import java.util.List; public interface ExtSysAuthMapper { - List searchAuth(SysAuthRequest request); + List searchAuth(SysAuthRequest request); Boolean authExist(@Param("authSource") String authSource, @Param("authTarget") String authTarget); diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.xml index 9131f63401..4c24e6aeaa 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysAuthMapper.xml @@ -2,17 +2,15 @@ - - - - - - - - + + + + + - select sys_auth.id, sys_auth.auth_source, diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java index 7dbe904cc4..f269b3c4fd 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.java @@ -7,4 +7,5 @@ import java.util.List; public interface ExtVAuthModelMapper { List searchTree(BaseTreeRequest request); + } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml index ee2d0bf01a..56f1be6f98 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtVAuthModelMapper.xml @@ -19,7 +19,7 @@ model_type = #{modelType} - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids2 ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids2 ,#{modelType})) and v_auth_model.pid = #{pid} @@ -36,7 +36,8 @@ - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( (select GROUP_CONCAT(id) from v_auth_model where model_type = #{modelType} and `name` like CONCAT('%', #{name},'%')) ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( (select GROUP_CONCAT(id) from + v_auth_model where model_type = #{modelType} and `name` like CONCAT('%', #{name},'%')) ,#{modelType})) @@ -54,7 +55,7 @@ model_type = #{modelType} - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids3 ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids3 ,#{modelType})) ) authTemp @@ -69,4 +70,5 @@ + diff --git a/backend/src/main/java/io/dataease/commons/constants/SystemConstants.java b/backend/src/main/java/io/dataease/commons/constants/SystemConstants.java index e474609ae8..3cb14c5c06 100644 --- a/backend/src/main/java/io/dataease/commons/constants/SystemConstants.java +++ b/backend/src/main/java/io/dataease/commons/constants/SystemConstants.java @@ -19,5 +19,10 @@ public class SystemConstants { public final static Integer OFF = 0; } + public static final class AUTH_SOURCE{ + public final static String MENU = "menu"; + } + + } diff --git a/backend/src/main/java/io/dataease/controller/sys/SysAuthController.java b/backend/src/main/java/io/dataease/controller/sys/SysAuthController.java index d21b9735a3..0975dd7e7e 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysAuthController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysAuthController.java @@ -9,6 +9,7 @@ import io.dataease.controller.request.BaseTreeRequest; import io.dataease.controller.request.SysAuthDetailRequest; import io.dataease.controller.request.SysAuthRequest; import io.dataease.dto.BaseAuthDetail; +import io.dataease.dto.SysAuthDetailDTO; import io.dataease.dto.VAuthModelDTO; import io.dataease.service.sys.SysAuthService; import io.swagger.annotations.Api; @@ -44,7 +45,7 @@ public class SysAuthController { @ApiOperation("查询授权") @PostMapping("/authDetails") - public Map> authDetails(@RequestBody SysAuthRequest request){ + public Map> authDetails(@RequestBody SysAuthRequest request){ return sysAuthService.searchAuthDetails(request); } diff --git a/backend/src/main/java/io/dataease/dto/SysAuthDetailDTO.java b/backend/src/main/java/io/dataease/dto/SysAuthDetailDTO.java new file mode 100644 index 0000000000..371a02abaf --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/SysAuthDetailDTO.java @@ -0,0 +1,20 @@ +package io.dataease.dto; + +import io.dataease.base.domain.SysAuthDetail; +import lombok.Data; + +/** + * Author: wangjiahao + * Date: 2021-06-03 + * Description: + */ +@Data +public class SysAuthDetailDTO extends SysAuthDetail { + private String authSource; + + private String authSourceType; + + private String authTarget; + + private String authTargetType; +} diff --git a/backend/src/main/java/io/dataease/service/sys/SysAuthService.java b/backend/src/main/java/io/dataease/service/sys/SysAuthService.java index 9c815d7624..bfb9a1355a 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysAuthService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysAuthService.java @@ -12,12 +12,10 @@ import io.dataease.commons.constants.SystemConstants; import io.dataease.commons.utils.AuthUtils; import io.dataease.controller.request.BaseTreeRequest; import io.dataease.controller.request.SysAuthRequest; -import io.dataease.dto.SysAuthDTO; -import io.dataease.dto.SysDeptDTO; +import io.dataease.dto.SysAuthDetailDTO; import io.dataease.dto.VAuthModelDTO; import io.dataease.i18n.Translator; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -25,6 +23,8 @@ import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import static java.util.stream.Collectors.groupingBy; + @Service public class SysAuthService { @@ -41,7 +41,7 @@ public class SysAuthService { @Resource private ExtVAuthModelMapper extVAuthModelMapper; - private static List PRI_MODEL_TYPE = Arrays.asList("link","dataset","chart","panel","menu"); + private static List PRI_MODEL_TYPE = Arrays.asList("link", "dataset", "chart", "panel", "menu"); /** @@ -51,23 +51,22 @@ public class SysAuthService { public List searchAuthModelTree(BaseTreeRequest request) { CurrentUserDto currentUserDto = AuthUtils.getUser(); request.setCreateBy(String.valueOf(currentUserDto.getUserId())); - if(PRI_MODEL_TYPE.contains(request.getModelType())&&(currentUserDto.getIsAdmin() == null || !currentUserDto.getIsAdmin())){ + if (PRI_MODEL_TYPE.contains(request.getModelType()) && (currentUserDto.getIsAdmin() == null || !currentUserDto.getIsAdmin())) { request.setWithAuth("1"); - }else{ + } else { request.setWithAuth("0"); } return extVAuthModelMapper.searchTree(request); } - /** * @Description: 查询授权明细map **/ - public Map> searchAuthDetails(SysAuthRequest request) { - List authDTOList = extSysAuthMapper.searchAuth(request); - return Optional.ofNullable(authDTOList).orElse(new ArrayList<>()).stream() - .collect(Collectors.toMap(SysAuthDTO::getAuthSource, SysAuthDTO::getSysAuthDetails)); + public Map> searchAuthDetails(SysAuthRequest request) { + List authDetailDTOList = extSysAuthMapper.searchAuth(request); + return Optional.ofNullable(authDetailDTOList).orElse(new ArrayList<>()).stream() + .collect(groupingBy(SysAuthDetailDTO::getAuthSource)); } /** @@ -81,33 +80,33 @@ public class SysAuthService { SysAuthDetail sysAuthDetail = request.getAuthDetail(); //TODO 获取需要授权的资源id(当前节点和所有权限的下级节点) List authSources = getAuthModels(request.getAuthSource(), request.getAuthSourceType()); - if(CollectionUtils.isEmpty(authSources)){ + if (CollectionUtils.isEmpty(authSources)) { throw new RuntimeException(Translator.get("i18n_auth_source_be_canceled")); } //TODO 获取需要被授权的目标id(部门当前节点和所有权限的下级节点) - List authTargets =getAuthModels(request.getAuthTarget(), request.getAuthTargetType()); + List authTargets = getAuthModels(request.getAuthTarget(), request.getAuthTargetType()); - if(CollectionUtils.isNotEmpty(authSources)&& CollectionUtils.isNotEmpty(authTargets)){ + if (CollectionUtils.isNotEmpty(authSources) && CollectionUtils.isNotEmpty(authTargets)) { List authIdChange = new ArrayList<>(); authTargets.stream().forEach(authTarget -> { - authSources.forEach(authSource ->{ - String authId = checkAuth(authSource, request.getAuthSourceType(),authTarget,request.getAuthTargetType()); + authSources.forEach(authSource -> { + String authId = checkAuth(authSource, request.getAuthSourceType(), authTarget, request.getAuthTargetType()); authIdChange.add(authId); }); }); // 授权修改 - if(sysAuthDetail.getPrivilegeValue()==SystemConstants.PRIVILEGE_VALUE.ON){ + if (sysAuthDetail.getPrivilegeValue() == SystemConstants.PRIVILEGE_VALUE.ON) { //当前为开启1 >>> 关闭0 需要将权限级别(PrivilegeType)大于当前级别的全新都修改为关闭 0 - extSysAuthDetailMapper.authDetailsChange(SystemConstants.PRIVILEGE_VALUE.OFF,sysAuthDetail.getPrivilegeType(),authIdChange); - }else{ + extSysAuthDetailMapper.authDetailsChange(SystemConstants.PRIVILEGE_VALUE.OFF, sysAuthDetail.getPrivilegeType(), authIdChange); + } else { //当前为关闭0 >>> 开启1 需要将权限级别(PrivilegeType)小于当前级别的全新都修改为开启 1 - extSysAuthDetailMapper.authDetailsChange(SystemConstants.PRIVILEGE_VALUE.ON,sysAuthDetail.getPrivilegeType(),authIdChange); + extSysAuthDetailMapper.authDetailsChange(SystemConstants.PRIVILEGE_VALUE.ON, sysAuthDetail.getPrivilegeType(), authIdChange); } } } private List getAuthModels(String id, String type) { - List vAuthModelDTOS = searchAuthModelTree(new BaseTreeRequest(id,type, SystemConstants.WITH_EXTEND.CHILDREN)); + List vAuthModelDTOS = searchAuthModelTree(new BaseTreeRequest(id, type, SystemConstants.WITH_EXTEND.CHILDREN)); List authSources = Optional.ofNullable(vAuthModelDTOS).orElse(new ArrayList<>()).stream().map(VAuthModelDTO::getId) .collect(Collectors.toList()); return authSources; @@ -116,9 +115,9 @@ public class SysAuthService { /** * @Description: 查询当前target 是否有存在授权 不存在 增加权限 并复制权限模板 **/ - private String checkAuth(String authSource,String authSourceType,String authTarget,String authTargetType){ - String authId = extSysAuthMapper.findAuthId(authSource,authSourceType,authTarget,authTargetType); - if(StringUtils.isEmpty(authId)){ + private String checkAuth(String authSource, String authSourceType, String authTarget, String authTargetType) { + String authId = extSysAuthMapper.findAuthId(authSource, authSourceType, authTarget, authTargetType); + if (StringUtils.isEmpty(authId)) { authId = UUID.randomUUID().toString(); //TODO 插入权限 SysAuth sysAuthRecord = new SysAuth(); @@ -132,10 +131,11 @@ public class SysAuthService { sysAuthMapper.insertSelective(sysAuthRecord); //TODO 复制权限模板 - extSysAuthDetailMapper.copyAuthModel(authSourceType,authId,AuthUtils.getUser().getUsername()); + extSysAuthDetailMapper.copyAuthModel(authSourceType, authId, AuthUtils.getUser().getUsername()); } return authId; } + }