0

这是上下文:

我使用带有 api 平台的 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)",
 *          },
 * }

它也不起作用。

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

4

1 回答 1

0

只是一个提示。我认为该操作必须命名为“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)。因此,如果您打算授予子资源的类或对象本身,我认为您将需要一些额外的工作(请考虑是否真的需要它)。

于 2020-06-16T09:39:39.840 回答