未调用通过子资源的 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 选民的主要内容,如果未能解决你的问题,请参考以下文章