【发布时间】:2019-07-10 09:23:30
【问题描述】:
我正在尝试对对象的所有者实施访问控制。我正在使用 LexikJWTAuthenticationBundle,当我将检查限制为角色时,访问控制有效,但在检查对象属性时会引发异常。
我正在使用 composer 在 Symfony 4.3 项目上安装的 API 平台。 PHP 是 7.2.19。
我可以通过检查角色成功地将请求限制为登录用户,但是当添加类似“object.owner == user”的内容时,它会失败并显示“hydra:description”:“无法访问私有财产 App\Entity\Vehicle ::$所有者”
这是具有相关字段的实体类。
/**
* @ApiResource(
* collectionOperations={"get"={"access_control"="is_granted('ROLE_USER')"}, "post"={"access_control"="is_granted('ROLE_USER')"}},
* itemOperations={"get"={"access_control"="is_granted('ROLE_USER') and object.owner == user"}, "put"={"access_control"="is_granted('ROLE_USER') and previous_object.owner == user"}},
* normalizationContext={"groups"={"vehicle:read"}},
* denormalizationContext={"groups"={"vehicle:write"}}
* )
* @ORM\Entity(repositoryClass="App\Repository\VehicleRepository")
* @ApiFilter(SearchFilter::class, properties={"owner": "exact"})
*/
class Vehicle
{
/**
* @Assert\NotBlank()
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="vehicles")
* @ORM\JoinColumn(nullable=false)
* @Groups({"vehicle:read", "vehicle:write"})
*/
private $owner;
public function getOwner(): User
{
return $this->owner;
}
}
这应该只允许拥有的用户获取或更新车辆,但它总是失败并显示“hydra:description”:“无法访问私有财产 App\Entity\Vehicle::$owner”。
如果我删除了“object.owner == user”注释,但保留了对 ROLE_USER 的检查,则允许该操作。
【问题讨论】:
-
你可以在任何字符串上使用
is_granted(),比如IS_OWNER,并添加一个安全投票者来进行所有者检查 -
@tsafiq 这是一种有趣的方法。我发现this 评论带有如何做到这一点的例子。谢谢!
-
不客气,这是一个很常见的需求,有没有做过!不要忘记将
object作为is_granted()的第二个参数传递,应该没问题???? -
我也会添加一个投票者,但是我的代码和你的非常相似,并且可以正常工作。您的吸气剂不尊重最佳实践。即使不能为空,也应该可以返回null。 Tru 将 getter 声明替换为 public
function getOwner(): ?User
标签: api-platform.com