在这部分文档中,并非所有使用警卫的用例都解释清楚:
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);
}
但是这个解决方案不符合原来的声明模式。