近一个月以来,我一直在尽最大努力在现有的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没有任何帮助
1条答案
按热度按时间hs1ihplo1#
在这里的评论中找到了答案。为了在一个还没有创建的对象上测试这个能力,我必须创建一个对象,它尽可能地与使用prisma.create方法后的对象的外观相似。正如你在这里看到的例子:
当然,如果您的项目需要它,您可能需要进行调整。请参阅Sergii Stotskyi对原始问题的评论,以获得完整代码中更通用的示例。