typescript 在实体创建之前检查CASL功能|NestJS + PrismaORM + CASL项目

inn6fuwd  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(177)

近一个月以来,我一直在尽最大努力在现有的NestJS项目中实现授权机制。但是我今天在最后一个步骤中被阻止了,这将允许我验证用户是否可以创建实体。
我在网上看到很多例子,但我没有找到任何使用相同配置的例子(我使用NestJS + PrismaORM和CASL)。使用Prisma有它的好处,但目前它的工作方式阻碍了我。
由于Prisma在“创建”命令通过后立即将创建的实体保存在数据库中,因此我无法使用我在其他mongoose项目中看到的技术,其中开发人员创建了实体,然后使用类似于以下内容验证了实体:

if (!ability.can(EntityAction.CREATE, 'MyEntity', entity)) {
  throw new ForbiddenException('You are not authorized to create this entity.');
}

如果没有抛出异常,最后将实体保存到DB中。
事实上,我不想只检查用户是否可以创建实体,否则我会这样做:

if (!ability.can(EntityAction.CREATE, 'MyEntity') {
  throw new ForbiddenException('You are not authorized to create this entity.');
}

正如我在我的动作上定义的条件,正如你在这个例子中看到的:

can(EntityAction.CREATE, 'MyEntity', {
    rank: { $gt: role.rank },
    unitId: role.unitId
});

(其中role是用户的角色,我根据roles属性给予权限)
我还想检查为创建提供的参数是否遵循条件。如果你有任何解决方案的想法或需要更多的信息,告诉我!
我试着在AbilityFactory创建的能力中导航,以找到任何可以帮助我完成任务的属性或方法,搜索CASL文档,使用相同库的Web示例,当然GPT没有任何帮助

hs1ihplo

hs1ihplo1#

在这里的评论中找到了答案。为了在一个还没有创建的对象上测试这个能力,我必须创建一个对象,它尽可能地与使用prisma.create方法后的对象的外观相似。正如你在这里看到的例子:

const USER_SUBJECT = subject('User', { ...args, createdAt: new Date(), uuid: 'false uuid', id: BigInt(-1) });
if (ability.cannot(DirectoryAction.CREATE, USER_SUBJECT)) {
    throw new UnauthorizedException('Tried to create unauthorized resource (User)');
}

当然,如果您的项目需要它,您可能需要进行调整。请参阅Sergii Stotskyi对原始问题的评论,以获得完整代码中更通用的示例。

相关问题