未调用通过子资源的 Symfony 选民

Posted

技术标签:

【中文标题】未调用通过子资源的 Symfony 选民【英文标题】:Symfony voter via subresource is not being called 【发布时间】:2020-09-21 01:46:26 【问题描述】:

这里是上下文:

我使用带有 api-platform 的 Symfony 3.4。

我有两个班级:

供应商 产品

我要列出所有供应商的产品

在供应商实体中,我在常规 CRUD 方法上实现了 access_control,该方法适用于选民。

我也有一条通过子资源的路线无法正常工作:

 * collectionOperations=
 *          "get"=
 *              "access_control"="is_granted('LIST', object)",
 *              "normalization_context"="groups"="supplier.liste",
 *          ,
 *     ,
 *     itemOperations=
 *          "get"=
 *              "method"="GET",
 *              "access_control"="is_granted('VIEW', object)",
 *          ,
 *     ,
 *     subresourceOperations=
 *          "supplier_product_get"=
 *              "path"="/supplier/id/products",
 *              "method"= "GET",
 *              "access_control"="is_granted('LIST', object)",
 *          ,
 * 

问题是,子资源的访问控制不起作用。它应该去检查选民对该资源的许可,但不检查选民并在我需要他返回 403 时返回 HTTP 响应代码 200。

我已经检查了他们使用安全性而不是 access_control 的文档:

 * subresourceOperations=
 *          "supplier_product_get"=
 *              "path"="/supplier/id/products",
 *              "method"= "GET",
 *              "security"="is_granted('LIST', object)",
 *          ,
 * 

而且它也不起作用。

有没有人知道为什么不叫选民的任何线索或提示?

【问题讨论】:

【参考方案1】:

只有一个提示。我认为操作必须命名为“api_questions_answer_get_subresource”,在您的情况下为“api_products_supplier_get_subresource”(使用“bin/console debug:router”检查名称)。 见https://api-platform.com/docs/core/subresources/#subresources "请注意,此处的操作名称 api_questions_answer_get_subresource 是重要的关键字。它会自动设置为 $resources_$subresource(s)_get_subresource。要找到正确的操作名称,您可以使用 bin/console debug:router。 “ 此外,您似乎可以在 is_granted 中使用 'object' 参数,它包含子资源的集合(在我的例子中,ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator)。因此,如果您打算授予子资源的类或对象本身,我认为您将需要一些额外的工作(请考虑是否真的需要它)。

【讨论】:

以上是关于未调用通过子资源的 Symfony 选民的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 ACL 与选民

symfony2 选民或 acl

通过单元测试访问 Symfony 2 容器?

在 Symfony Messenger 异步消息处理程序上使用选民/权限的最佳方式? [关闭]

在 symfony ACL 中禁用对象身份检查

将对象传递给自定义选民?