2

在这部分文档中,并非所有使用警卫的用例都解释清楚:
NestJS Docs - 基于声明的授权

CaslAbilityFactory 为这些用例实现:

  • 管理员可以管理(创建/读取/更新/删除)所有实体
  • 用户对所有内容都有只读访问权限
  • 用户可以更新他们的文章(article.authorId === userId)
  • 已发布的文章无法删除(article.isPublished === true)

并且只解释了最琐碎的用例:

用户对所有内容都有只读访问权限

使用此控制器方法进行了演示:

@Get()
@UseGuards(PoliciesGuard)
@checkPolicies((ability: AppAbility) => ability.can(Action.Read, Article))
findAll() {
    return this.articlesService.findAll();
}

但是我应该如何注释检查第三个或第四个用例的方法:

已发表的文章无法删除:
(article.isPublished === true)

@Delete()
@UseGuards(PoliciesGuard)
@checkPolicies(?????????????????????????????)
delete(@Body() article: Article) {
    return this.articlesService.delete(article.id);
}

有可能吗?对于此要求,@checkPolicies 中声明的 PoliciesGuard 或处理程序应该能够访问方法参数。

如何从守卫访问控制器方法参数?

如果您直接从控制器方法调用 ability.can(...) ,当然是一种解决方法:

@Delete()
@UseGuards(SomeGuards but NOT PoliciesGuard)
delete(@Body() article: Article) {
    const ability = this.caslAbilityFactory.createForUser(<<user from request>>);
    if (!ability.can(Action.Delete, article)) {
       throw new UnauthorizedException();
    }
    return this.articlesService.delete(article.id);
}

但是这个解决方案不符合原来的声明模式。

4

0 回答 0