|
@@ -1,5 +1,6 @@
|
|
|
package com.qmth.teachcloud.common.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qmth.teachcloud.common.bean.dto.DataPermissionInfo;
|
|
@@ -19,10 +20,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
@@ -142,13 +140,12 @@ public class BasicRoleDataPermissionServiceImpl extends ServiceImpl<BasicRoleDat
|
|
|
DataPermissionRule result = new DataPermissionRule();
|
|
|
if (Objects.nonNull(sysPrivilege)) {
|
|
|
// 角色集合
|
|
|
- List<Long> roleIdList = sysRoleService.getUserRoles(requestUserId);
|
|
|
+ List<SysRole> sysRoleList = sysRoleService.listRolesByUserId(requestUserId);
|
|
|
// 数据库中存在该方法的url
|
|
|
int maxWeight = 0;
|
|
|
DataPermissionTypeEnum finalPermissionType = null;
|
|
|
- for (Long roleId : roleIdList) {
|
|
|
- DataPermissionTypeEnum roleDataPermissionType = this.searchRoleDataPermissionByPrivilege(roleId,
|
|
|
- sysPrivilege, schoolId);
|
|
|
+ for (SysRole sysRole : sysRoleList) {
|
|
|
+ DataPermissionTypeEnum roleDataPermissionType = this.searchRoleDataPermissionByPrivilege(sysRole, sysPrivilege, schoolId);
|
|
|
if (Objects.nonNull(roleDataPermissionType)) {
|
|
|
// 角色数据权限不为空时,筛选出所有角色在该url中的最大范围数据权限为该url的最终数据权限
|
|
|
int weight = roleDataPermissionType.getWeight();
|
|
@@ -159,20 +156,24 @@ public class BasicRoleDataPermissionServiceImpl extends ServiceImpl<BasicRoleDat
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (Objects.nonNull(finalPermissionType)) {
|
|
|
- // 最终数据权限不为空
|
|
|
- SysUser requestUser = sysUserService.getById(requestUserId);
|
|
|
- switch (finalPermissionType) {
|
|
|
+
|
|
|
+ // 默认为本人数据权限
|
|
|
+ if (Objects.isNull(finalPermissionType)) {
|
|
|
+ finalPermissionType = DataPermissionTypeEnum.SELF;
|
|
|
+ }
|
|
|
+ // 最终数据权限不为空
|
|
|
+ SysUser requestUser = sysUserService.getById(requestUserId);
|
|
|
+ switch (finalPermissionType) {
|
|
|
case SELF:
|
|
|
// 只能看自己创建的
|
|
|
result.setRequestUserId(requestUserId);
|
|
|
break;
|
|
|
+ case SELF_COURSE:
|
|
|
+ // todo 课程数据权限
|
|
|
case SELF_ORG:
|
|
|
// 只能看自己所在机构
|
|
|
Long orgId = requestUser.getOrgId();
|
|
|
- Set<Long> orgIdSet = new HashSet<>();
|
|
|
- orgIdSet.add(orgId);
|
|
|
- result.setOrgIdSet(orgIdSet);
|
|
|
+ result.setOrgIdSet(new HashSet<>(Arrays.asList(orgId)));
|
|
|
break;
|
|
|
case SELF_ORG_BELOW:
|
|
|
// 只能看自己所在机构和所辖机构
|
|
@@ -180,7 +181,6 @@ public class BasicRoleDataPermissionServiceImpl extends ServiceImpl<BasicRoleDat
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
@@ -189,57 +189,49 @@ public class BasicRoleDataPermissionServiceImpl extends ServiceImpl<BasicRoleDat
|
|
|
/**
|
|
|
* 递归搜索角色的数据权限
|
|
|
*
|
|
|
- * @param roleId 角色id
|
|
|
+ * @param sysRole 角色对象
|
|
|
* @param privilege url权限
|
|
|
* @return 角色数据权限规则
|
|
|
*/
|
|
|
- private DataPermissionTypeEnum searchRoleDataPermissionByPrivilege(Long roleId, SysPrivilege privilege, Long schoolId) {
|
|
|
+ private DataPermissionTypeEnum searchRoleDataPermissionByPrivilege(SysRole sysRole, SysPrivilege privilege, Long schoolId) {
|
|
|
Long privilegeId = privilege.getId();
|
|
|
PrivilegeEnum type = privilege.getType();
|
|
|
// 如果是菜单,搜索该菜单是否绑定了数据权限
|
|
|
if (PrivilegeEnum.MENU.equals(type)) {
|
|
|
- SysRole sysRole = sysRoleService.getById(roleId);
|
|
|
QueryWrapper<BasicRoleDataPermission> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(BasicRoleDataPermission::getRoleId, roleId)
|
|
|
- .eq(BasicRoleDataPermission::getPrivilegeId, privilegeId)
|
|
|
- .eq(BasicRoleDataPermission::getSchoolId, schoolId);
|
|
|
+ LambdaQueryWrapper<BasicRoleDataPermission> lambda = queryWrapper.lambda();
|
|
|
+ lambda.eq(BasicRoleDataPermission::getRoleId, sysRole.getId())
|
|
|
+ .eq(BasicRoleDataPermission::getPrivilegeId, privilegeId);
|
|
|
+ if (sysRole.getDefaultRole()) {
|
|
|
+ lambda.isNull(BasicRoleDataPermission::getSchoolId);
|
|
|
+ } else {
|
|
|
+ lambda.eq(BasicRoleDataPermission::getSchoolId, schoolId);
|
|
|
+ }
|
|
|
BasicRoleDataPermission basicRoleDataPermission = this.getOne(queryWrapper);
|
|
|
if (Objects.nonNull(basicRoleDataPermission)) {
|
|
|
// 有数据权限
|
|
|
return basicRoleDataPermission.getDataPermissionType();
|
|
|
- } else if (sysRole.getDefaultRole()) {
|
|
|
- // 查询默认
|
|
|
- BasicRoleDataPermission defaultBasicRoleDataPermission = this.getOne(new QueryWrapper<BasicRoleDataPermission>().lambda()
|
|
|
- .eq(BasicRoleDataPermission::getRoleId, roleId)
|
|
|
- .eq(BasicRoleDataPermission::getPrivilegeId, privilegeId).isNull(BasicRoleDataPermission::getSchoolId));
|
|
|
- if (Objects.nonNull(defaultBasicRoleDataPermission)) {
|
|
|
- // 有数据权限
|
|
|
- return defaultBasicRoleDataPermission.getDataPermissionType();
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
// 如果该url不是菜单类型则查询其父目录
|
|
|
- return getDataPermissionRule(roleId, privilege, schoolId);
|
|
|
+ return getDataPermissionRule(sysRole, privilege, schoolId);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查询父菜单是否包含数据权限
|
|
|
*
|
|
|
- * @param roleId 角色id
|
|
|
+ * @param sysRole 角色对象
|
|
|
* @param privilege 权限
|
|
|
* @return 数据权限规则
|
|
|
*/
|
|
|
- private DataPermissionTypeEnum getDataPermissionRule(Long roleId, SysPrivilege privilege, Long schoolId) {
|
|
|
+ private DataPermissionTypeEnum getDataPermissionRule(SysRole sysRole, SysPrivilege privilege, Long schoolId) {
|
|
|
Long parentId = privilege.getParentId();
|
|
|
if (SystemConstant.longNotNull(parentId)) {
|
|
|
SysPrivilege parent = sysPrivilegeService.getById(parentId);
|
|
|
if (Objects.nonNull(parent)) {
|
|
|
- return this.searchRoleDataPermissionByPrivilege(roleId, parent, schoolId);
|
|
|
- } else {
|
|
|
- return null;
|
|
|
+ return this.searchRoleDataPermissionByPrivilege(sysRole, parent, schoolId);
|
|
|
}
|
|
|
- } else {
|
|
|
- return null;
|
|
|
}
|
|
|
+ return DataPermissionTypeEnum.SELF;
|
|
|
}
|
|
|
}
|