如何在特定查询上覆盖Doctrine @userAware注释/过滤器?

问题描述 投票:0回答:1

我按照this instruction创建了一个@userAware注释,它自动将对特定实体的所有查询限制为当前用户。

例如,$todoRepo->findByTag("someTag")会自动将WHERE user_id = 123添加到生成的查询中,以确保只能访问当前用户(id 123)的ToDo实体。

这很好但有一个很大的缺点:例如,如果管理员知道有多少ToDo实体使用标签someTag他只会找到自己的实体...

由于使用@userAware注释似乎很常见,我想知道是否有关于如何在特定查询上禁用/绕过/覆盖此过滤器/注释的最佳实践。

symfony doctrine
1个回答
0
投票

您可以禁用过滤器。在您的示例中,您必须更改内核请求事件,就像那样......

public function onKernelRequest()
{
    if ($user = $this->getUser()) {
        if ($user->isAdmin() /* or whatever */) {
             $this->em->getFilters()->disable('user_filter');
        } else {
             $filter = $this->em->getFilters()->enable('user_filter');
             $filter->setParameter('id', $user->getId());
             $filter->setAnnotationReader($this->reader);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.