typescript Nestjs Casl -检查用户是否与资源存在多对多关系

n3h0vuf2  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(195)

我试图使一个访问控制系统的基础上,用户和资源(项目,文档和其他)之间的多对多的关系。主要的关键是,无论我看到基于角色的AC允许用户编辑一种类型的资源,而不是基于ID的特定资源。我有:项目:{id,...,编辑者:[用户:{ id,...},用户:{id...} ]我希望使用casl(我愿意使用casl以外的其他解决方案)检查请求中的用户是否在Project.editors数组中。
在能力工厂定义能力(用户ID)中

export enum Action {
    Edit = 'Edit',
    View = 'View',
}

export enum Resource {
    Project = 'project',
}
const user = await this.userService.findOne(userId);

can(Action.Edit, Project, { editors: user });

在控制器(临时解决方案,我将在未来使用保护)中,我这样检查:

const ability = await this.abilityFactory.defineAbility(userId);
const project = await this.projectService.findOne(id);

if (!ability.can(Action.Edit, project)) {
    throw new ForbiddenException('Access denied!');
}

但这样做效果不好,总是返回false......
有办法吗?

ozxc1zmp

ozxc1zmp1#

CASL使用的MongoDB查询语言定义如下:https://www.mongodb.com/docs/manual/tutorial/query-documents/
要在复杂类型列表(由ORM 1:n或n:m关系构建)中搜索字段,可以使用$elemMatch操作符,如果数组中的任何文档与某个属性匹配,则会产生正结果:

can(Action.Edit, Project, { editors: {
                                $elemMatch: {
                                    userId: user.userId
                                }
                        });

相关问题