Search in sources :

Example 1 with IamResourcePermission

use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.

the class IamResourcePermissionServiceImpl method updateMenuAndPermissions.

@Override
@Transactional(rollbackFor = Exception.class)
public void updateMenuAndPermissions(IamResourcePermissionDTO iamResourcePermissionDTO) {
    // 检查是否设置了自身id为parentId,如果设置parentId与自身id相同,将会导致非常严重的潜在隐患
    if (V.equals(iamResourcePermissionDTO.getId(), iamResourcePermissionDTO.getParentId())) {
        throw new BusinessException(Status.FAIL_OPERATION, "不可设置父级菜单资源为自身");
    }
    // 设置menu的接口列表
    if (V.notEmpty(iamResourcePermissionDTO.getApiSetList())) {
        iamResourcePermissionDTO.setApiSet(S.join(iamResourcePermissionDTO.getApiSetList(), ","));
    }
    // 更新menu
    this.updateEntity(iamResourcePermissionDTO);
    List<IamResourcePermissionDTO> permissionList = iamResourcePermissionDTO.getPermissionList();
    permissionList.forEach(p -> {
        p.setParentId(iamResourcePermissionDTO.getId());
        p.setDisplayType(Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION.name());
    });
    // 需要更新的列表
    List<IamResourcePermissionDTO> updatePermissionList = permissionList.stream().filter(p -> V.notEmpty(p.getId())).collect(Collectors.toList());
    // 需要新建的列表
    List<IamResourcePermissionDTO> createPermissionDTOList = permissionList.stream().filter(p -> V.isEmpty(p.getId())).collect(Collectors.toList());
    List<Long> updatePermissionIdList = updatePermissionList.stream().map(IamResourcePermission::getId).collect(Collectors.toList());
    // 批量删除不存在的按钮/权限列表
    List<IamResourcePermission> oldPermissionList = this.getEntityList(Wrappers.<IamResourcePermission>lambdaQuery().eq(IamResourcePermission::getParentId, iamResourcePermissionDTO.getId()).eq(IamResourcePermission::getDisplayType, Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION));
    if (V.notEmpty(oldPermissionList)) {
        LambdaQueryWrapper<IamResourcePermission> deleteWrapper = Wrappers.<IamResourcePermission>lambdaQuery().eq(IamResourcePermission::getParentId, iamResourcePermissionDTO.getId()).eq(IamResourcePermission::getDisplayType, Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION);
        if (V.notEmpty(updatePermissionIdList)) {
            deleteWrapper.notIn(IamResourcePermission::getId, updatePermissionIdList);
        }
        this.deleteEntities(deleteWrapper);
    }
    // 批量新建按钮/权限列表
    if (V.notEmpty(createPermissionDTOList)) {
        List<IamResourcePermission> createPermissionList = BeanUtils.convertList(createPermissionDTOList, IamResourcePermission.class);
        this.createEntities(createPermissionList);
    }
    // 批量更新按钮/权限列表
    if (V.notEmpty(updatePermissionList)) {
        for (IamResourcePermissionDTO updatePermission : updatePermissionList) {
            this.updateEntity(updatePermission);
        }
    }
    // 检测是否有脏数据存在
    if (hasDirtyData()) {
        throw new BusinessException(Status.FAIL_OPERATION, "父级节点不可设置在自己的子节点上");
    }
// 清理脏数据
// this.clearDirtyData();
}
Also used : Wrappers(com.baomidou.mybatisplus.core.toolkit.Wrappers) RelationsBinder(com.diboot.core.binding.RelationsBinder) InvalidResourcePermissionVO(com.diboot.iam.vo.InvalidResourcePermissionVO) java.util(java.util) IamCacheManager(com.diboot.iam.cache.IamCacheManager) Status(com.diboot.core.vo.Status) LambdaQueryWrapper(com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper) BusinessException(com.diboot.core.exception.BusinessException) IamResourcePermissionMapper(com.diboot.iam.mapper.IamResourcePermissionMapper) Collectors(java.util.stream.Collectors) Slf4j(lombok.extern.slf4j.Slf4j) S(com.diboot.core.util.S) V(com.diboot.core.util.V) Service(org.springframework.stereotype.Service) Cons(com.diboot.iam.config.Cons) IamResourcePermissionService(com.diboot.iam.service.IamResourcePermissionService) IamResourcePermissionDTO(com.diboot.iam.dto.IamResourcePermissionDTO) IamResourcePermissionListVO(com.diboot.iam.vo.IamResourcePermissionListVO) BeanUtils(com.diboot.core.util.BeanUtils) IamResourcePermission(com.diboot.iam.entity.IamResourcePermission) Transactional(org.springframework.transaction.annotation.Transactional) BusinessException(com.diboot.core.exception.BusinessException) IamResourcePermissionDTO(com.diboot.iam.dto.IamResourcePermissionDTO) IamResourcePermission(com.diboot.iam.entity.IamResourcePermission) Transactional(org.springframework.transaction.annotation.Transactional)

Example 2 with IamResourcePermission

use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.

the class IamResourcePermissionServiceImpl method sortList.

@Override
public void sortList(List<IamResourcePermission> permissionList) {
    if (V.isEmpty(permissionList)) {
        throw new BusinessException(Status.FAIL_OPERATION, "排序列表不能为空");
    }
    List<Long> sortIdList = new ArrayList();
    // 先将所有序号重新设置为自身当前id
    for (IamResourcePermission item : permissionList) {
        item.setSortId(item.getId());
        sortIdList.add(item.getSortId());
    }
    // 将序号列表倒序排序
    sortIdList = sortIdList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
    // 整理需要更新的列表
    List<IamResourcePermission> updateList = new ArrayList<>();
    for (int i = 0; i < permissionList.size(); i++) {
        IamResourcePermission item = permissionList.get(i);
        IamResourcePermission updateItem = new IamResourcePermission();
        updateItem.setId(item.getId());
        updateItem.setSortId(sortIdList.get(i));
        updateList.add(updateItem);
    }
    if (updateList.size() > 0) {
        super.updateBatchById(updateList);
    }
}
Also used : BusinessException(com.diboot.core.exception.BusinessException) IamResourcePermission(com.diboot.iam.entity.IamResourcePermission)

Example 3 with IamResourcePermission

use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.

the class IamResourcePermissionServiceImpl method hasTopRootNode.

/**
 * 是否拥有顶级节点
 * @param idObjectMap
 * @param item
 * @return
 */
private boolean hasTopRootNode(Map<String, IamResourcePermission> idObjectMap, IamResourcePermission item, List<Long> existIdList) {
    if (V.equals(item.getParentId(), 0L)) {
        return true;
    }
    if (existIdList == null) {
        existIdList = new ArrayList<Long>();
    }
    if (existIdList.contains(item.getId())) {
        return false;
    }
    // 如果不是顶级节点,则以此向上查找顶级节点,如果没有找到父级节点,则认为没有顶级节点,如果找到,则继续查找父级节点是否具有顶级节点
    IamResourcePermission parentItem = idObjectMap.get(String.valueOf(item.getParentId()));
    if (parentItem == null) {
        return false;
    }
    // 记录下当前检查的id,以免循环调用
    existIdList.add(item.getId());
    return hasTopRootNode(idObjectMap, parentItem, existIdList);
}
Also used : IamResourcePermission(com.diboot.iam.entity.IamResourcePermission)

Example 4 with IamResourcePermission

use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.

the class IamResourcePermissionServiceImpl method extractCodeDiffDbPermissions.

@Override
public Map<String, Object> extractCodeDiffDbPermissions(String application) {
    List<IamResourcePermission> allResourcePermissions = getEntityList(Wrappers.<IamResourcePermission>lambdaQuery().orderByDesc(IamResourcePermission::getSortId, IamResourcePermission::getId));
    if (V.isEmpty(allResourcePermissions)) {
        return Collections.emptyMap();
    }
    List<InvalidResourcePermissionVO> voList = RelationsBinder.convertAndBind(allResourcePermissions, InvalidResourcePermissionVO.class);
    Map<Long, InvalidResourcePermissionVO> resultMap = new HashMap<>(32);
    for (InvalidResourcePermissionVO invalidIamResourcePermission : voList) {
        if (V.isEmpty(invalidIamResourcePermission.getApiSet())) {
            continue;
        }
        for (String uri : invalidIamResourcePermission.getApiSetList()) {
            // 根据uri获取code
            String permissionCode = IamCacheManager.getPermissionCode(uri);
            // code存在,表示该URI有效,否则无效
            if (V.isEmpty(permissionCode)) {
                invalidIamResourcePermission.addInvalidApiSet(uri);
                resultMap.put(invalidIamResourcePermission.getId(), invalidIamResourcePermission);
            }
        }
    }
    if (V.isEmpty(resultMap)) {
        return Collections.emptyMap();
    }
    List<InvalidResourcePermissionVO> outerPermissionList = new ArrayList<>();
    for (Map.Entry<Long, InvalidResourcePermissionVO> invalidResourcePermissionVOEntry : resultMap.entrySet()) {
        InvalidResourcePermissionVO invalidResourcePermissionVO = invalidResourcePermissionVOEntry.getValue();
        // 获取当前权限的上级元素
        Long parentId = invalidResourcePermissionVO.getParentId();
        InvalidResourcePermissionVO parentInvalidResourcePermissionVO = resultMap.get(parentId);
        // 如果上级元素不存在,表示,当前对象为最外层元素
        if (V.isEmpty(parentInvalidResourcePermissionVO)) {
            outerPermissionList.add(invalidResourcePermissionVO);
        }
    }
    List<InvalidResourcePermissionVO> result = new ArrayList<>(resultMap.values());
    List<Long> diffDataIdList = new ArrayList<>();
    for (InvalidResourcePermissionVO value : result) {
        List<InvalidResourcePermissionVO> childNodeChildren = BeanUtils.buildTreeChildren(value.getId(), result, Cons.FieldName.parentId.name(), Cons.FieldName.children.name());
        if (childNodeChildren == null) {
            childNodeChildren = new ArrayList<>();
        }
        BeanUtils.setProperty(value, Cons.FieldName.children.name(), childNodeChildren);
        diffDataIdList.add(value.getId());
    }
    return new HashMap<String, Object>() {

        {
            put("diffDataList", outerPermissionList);
            put("diffDataIdList", diffDataIdList);
        }
    };
}
Also used : InvalidResourcePermissionVO(com.diboot.iam.vo.InvalidResourcePermissionVO) IamResourcePermission(com.diboot.iam.entity.IamResourcePermission)

Example 5 with IamResourcePermission

use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.

the class IamResourcePermissionServiceImpl method deepCreatePermissionAndChildren.

@Override
@Transactional(rollbackFor = Exception.class)
public void deepCreatePermissionAndChildren(IamResourcePermissionListVO iamResourcePermissionListVO) {
    if (iamResourcePermissionListVO == null) {
        return;
    }
    IamResourcePermission iamResourcePermission = (IamResourcePermission) iamResourcePermissionListVO;
    if (!super.createEntity(iamResourcePermission)) {
        log.warn("新建资源权限失败,displayType=" + iamResourcePermission.getDisplayType());
        throw new BusinessException(Status.FAIL_OPERATION, "新建资源权限失败");
    }
    List<IamResourcePermissionListVO> children = iamResourcePermissionListVO.getChildren();
    if (V.notEmpty(children)) {
        for (IamResourcePermissionListVO vo : children) {
            vo.setParentId(iamResourcePermission.getId());
            this.deepCreatePermissionAndChildren(vo);
        }
    }
}
Also used : BusinessException(com.diboot.core.exception.BusinessException) IamResourcePermissionListVO(com.diboot.iam.vo.IamResourcePermissionListVO) IamResourcePermission(com.diboot.iam.entity.IamResourcePermission) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

IamResourcePermission (com.diboot.iam.entity.IamResourcePermission)8 BusinessException (com.diboot.core.exception.BusinessException)3 LambdaQueryWrapper (com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper)2 IamResourcePermissionListVO (com.diboot.iam.vo.IamResourcePermissionListVO)2 InvalidResourcePermissionVO (com.diboot.iam.vo.InvalidResourcePermissionVO)2 Transactional (org.springframework.transaction.annotation.Transactional)2 Wrappers (com.baomidou.mybatisplus.core.toolkit.Wrappers)1 RelationsBinder (com.diboot.core.binding.RelationsBinder)1 BeanUtils (com.diboot.core.util.BeanUtils)1 S (com.diboot.core.util.S)1 V (com.diboot.core.util.V)1 Status (com.diboot.core.vo.Status)1 IamCacheManager (com.diboot.iam.cache.IamCacheManager)1 Cons (com.diboot.iam.config.Cons)1 IamResourcePermissionDTO (com.diboot.iam.dto.IamResourcePermissionDTO)1 IamResourcePermissionMapper (com.diboot.iam.mapper.IamResourcePermissionMapper)1 IamResourcePermissionService (com.diboot.iam.service.IamResourcePermissionService)1 IamRoleVO (com.diboot.iam.vo.IamRoleVO)1 java.util (java.util)1 ArrayList (java.util.ArrayList)1