我试图使一个访问控制系统的基础上,用户和资源(项目,文档和其他)之间的多对多的关系。主要的关键是,无论我看到基于角色的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......
有办法吗?
1条答案
按热度按时间ozxc1zmp1#
CASL使用的MongoDB查询语言定义如下:https://www.mongodb.com/docs/manual/tutorial/query-documents/
要在复杂类型列表(由ORM 1:n或n:m关系构建)中搜索字段,可以使用$elemMatch操作符,如果数组中的任何文档与某个属性匹配,则会产生正结果: