eladmin icon indicating copy to clipboard operation
eladmin copied to clipboard

用户设置多角色时的数据权限

Open qmmm61 opened this issue 2 years ago • 1 comments

版本: v2.6 环境: 本地/线上 复现步骤:设置三个角色,角色1,角色2,角色3,数据权限分别是自定义用户权限,全部用户权限,本级用户权限,设置用户拥有这三个角色,用户获取的数据权限时逻辑不明确。 具体获取用户数据权限的实现在DataServiceImpl的getDeptIds方法

    @Override
    @Cacheable(key = "'user:' + #p0.id")
    public List<Integer> getDeptIds(UserDto user) {
        // 用于存储部门id
        Set<Integer> deptIds = new HashSet<>();
        // 查询用户角色
        List<RoleSmallDto> roleSet = roleService.findByUsersId(user.getId());
        // 获取对应的部门ID
        for (RoleSmallDto role : roleSet) {
            DataScopeEnum dataScopeEnum = DataScopeEnum.find(role.getDataScope());
            switch (Objects.requireNonNull(dataScopeEnum)) {
                case THIS_LEVEL:
                    deptIds.add(user.getDept().getId());
                    break;
                case CUSTOMIZE:
                    deptIds.addAll(getCustomize(deptIds, role));
                    break;
                default:
                    return new ArrayList<>(deptIds);
            }
        }
        return new ArrayList<>(deptIds);
    }

这里返回数据权限结果集会因为查询用户所有角色集roleSet后,从中取出角色的顺序不同而不同,比如循环roleSet时取出的顺序是角色1,角色2,角色3,那么第一次循环,deptIds包含角色1的数据权限自定义数据权限,第二次循环因为是角色2是全部数据权限,return则直接返回new ArrayList<>(deptIds)后跳出循环,deptIds中就只有角色1的数据权限,最终这个用户就只有角色1的数据权限,根据这个样例不能理解这里返回多角色数据权限的逻辑。 日志提供: 无

qmmm61 avatar Oct 13 '21 08:10 qmmm61

页面没有看到数据权限控制的地方

nibinyang avatar Sep 20 '22 02:09 nibinyang

https://github.com/elunez/eladmin/issues/801

elunez avatar Jul 04 '23 09:07 elunez