下面是背景。
我使用Symfony 3.4和api-platform。
我有两个类。
我想列出所有供应商的产品。
在供应商实体中,我已经在常规CRUD方法上实现了访问控制,该方法在投票人中工作正常。
我也有一个通过子资源的路由,但不能正常工作。
* 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)",
* },
* }
而且它也不工作。
有谁知道为什么没有调用投票器的线索或提示吗?
只有一个小建议。我认为操作 有 命名为 "api_questions_answer_get_subresource",在你的例子中是 "api_products_supplier_get_subresource"(用 "binconsole debug:router "检查名称)。请看 https:/api-platform.comdocscores分资源#分资源。 "注意,操作名称,这里的api_questions_answer_get_subresource,是重要的关键字。它会被自动设置为$resources_$subresource(s)_get_subresource。要想找到正确的操作名称,可以使用binconsole debug:router。" 另外,似乎你可以在is_granted中使用'object'参数,它包含了子资源的集合(在我的例子中,ApiPlatform/Core/Bridge/Doctrine/Orm/Paginator)。所以,如果你打算对你的子资源的类,或者对象本身进行授予,我想你会需要一些额外的工作(只要考虑是否真的需要)。