我正在使用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
属性传递的分页器对象,并确保请求结果中的对象是 type User
。这部分已经过测试并且可以正常工作。
现在我的问题来自这样一个事实,即这两条路线与 my 基本相同voter
,因此我通过它实施的授权规则适用于它们。
我想做的是告诉我的选民这两个请求是不同的(我认为我可以在恢复Paginator
对象时这样做,但似乎不可能)所以我可以在同一个开关盒中分别处理它们。
到目前为止,我还没有找到实现它的方法
有没有办法实现这种规则?
还是有另一种方式来实现这种授权?
谢谢!