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



我正在尝试建立一个基于用户和资源(项目、文档和其他(之间的多对多关系的访问控制系统。主要的关键是,我在任何地方都看到了基于角色的AC,它允许用户编辑一种类型的资源,而不是基于ID的特定资源。我所拥有的:项目:{id,…,编辑器:[用户:{id,…},用户:{id…}]我想使用casl检查(我对casl以外的其他解决方案持开放态度(请求中的用户是否在Project.editors数组中。

在AbilityFactory中定义Ability(userId(

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。。。

有什么解决方案吗?

在后台,CASL正在使用MongoDB查询语言,如下所定义:https://www.mongodb.com/docs/manual/tutorial/query-documents/

为了在复杂类型列表中搜索字段(由ORM1:n或n:m关系构建(,您可以使用$elemMatch运算符,如果数组中的任何文档与某个属性匹配,则该运算符将产生正结果:

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

最新更新