【发布时间】:2021-04-10 04:41:09
【问题描述】:
我正在使用ApiPlatform 和Symfony5
我在 User 实体上放置了一个过滤器,以按名为 $expose 的类的布尔值对它们进行排序
用例:
- 对于
/users?expose=true路由ROLE_USER可以获得每个user的列表,过滤器$expose设置为true - 对于
/users/路由ROLE_ADMIN无论如何都可以获得每个user的列表
这是我的User 课程:
/**
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={"user:read", "user:list"}},
* "order"={"somefield.value": "ASC"}
* },
* collectionOperations={
* "get"={
* "mehtod"="GET",
* "security"="is_granted('LIST', object)",
* "normalization_context"={"groups"={"user:list"}},
* }
* }
* )
* @ApiFilter(ExistsFilter::class, properties={"expose"})
* @ApiFilter(SearchFilter::class, properties={
* "somefield.name": "exact"
* })
* @ORM\Entity(repositoryClass=UserRepository::class)
*/
我通过UserVoter实现我的授权规则:
protected function supports($attribute, $subject): bool
{
return parent::supports($attribute, $subject) &&
($subject instanceof User ||
$this->arrayOf($subject, User::class) ||
(is_a($subject, Paginator::class) &&
$this->arrayOf($subject->getQuery()->getResult(), User::class))
);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
if ($this->accessDecisionManager->decide($token, [GenericRoles::ROLE_ADMIN])) {
return true;
}
switch ($attribute) {
case Actions::LIST:
break;
}
return false;
}
为了恢复User 的列表,我恢复了通过LIST 属性传递的分页器对象,并确保请求结果中的对象是User 类型。
这部分已经过测试并且可以正常工作。
现在我的问题来自这两条路线与我的voter 基本相同,因此我通过它实施的授权规则适用于它们。
我想做的是告诉我的选民这两个请求是不同的(我认为我可以这样做,因为我恢复了 Paginator 对象但似乎不可能)所以我可以在相同的开关盒。
到目前为止,我还没有找到实现它的方法
有没有办法实现这种规则?
或者有没有其他方式来实现这种授权?
谢谢!
【问题讨论】:
标签: symfony filter authorization api-platform.com symfony4-voter