Как получить доступ к данным другого пользователя?


Я работаю над веб-приложением Symfony 2.7, в котором используется FOSUserBundle. Пока все работает нормально. Не хотелось бы добавлять серверную часть администратора, которая позволяла бы отображать подробную информацию о разных пользователях.

Например, в приложении телефонной книги должно быть видно, сколько контактов создал выбранный пользователь:

$contact_count = $this->contactsCountForUser(5);
...

public function contactsCountForUser($user_id) {
    $repo = $this->em->getRepository('AppBundle:Contact');

    $qb = $repo->createQueryBuilder('c');
    $qb->select('COUNT(c)');
    $qb->where('c.user = :userId');
    $qb->setParameter('userId', $user_id);           

    $sql = $qb->getQuery()->getSql();
    $count = $qb->getQuery()->getSingleScalarResult();

    return $count;
}

Это не удается, так как в качестве SQL-запроса создается следующее:

SELECT COUNT(c0_.guid) AS sclr0 FROM contact c0_ WHERE (c0_.user_id = ?) AND (c0_.user_id = '1')

Проблема 1: Почему $qb->where('c.user = :userId') переводится в c0_.user_id = ?? Почему не используется 5 beeing как идентификатор пользователя?

Проблема 2: AND (c0_.user_id = '1') автоматически добавляется в запрос. Я предполагаю, что это делается с помощью FOSUserBundle, который ограничивает запрос текущим пользователем. Здесь идентификатор 1 - это идентификатор текущего вошедшего в систему пользователя, который является администратором... Очевидно, что (c0_.user_id = ?) AND (c0_.user_id = '1') никогда не может быть правдой.

Итак: как мне убедить доктрину и/или FOSUserBundle в том, что администратор должен иметь возможность выполнять запросы к данным других пользователей?

Author: IAmInPLS, 2016-04-07

1 answers

Благодаря комментарию @LBA я смог найти источник проблемы:

Фрагмент стороннего кода добавляет SQLFilter в качестве аннотации UserAware. Эта веб-страница подробно описывает, что делается и как это работает.

Возможно, это может помочь другим избежать такого рода "проблем" и выяснить, что "неправильно":-)

О проблеме 1: Даже после решения проблемы 2 Проблема 1 остается прежней. Идентификатор пользователя по-прежнему преобразуется в ? в запросе. Однако это, похоже, не влияет на функцию кода. Насколько я вижу, все работает так, как и ожидалось.

 1
Author: Andrei Herford, 2016-04-08 06:32:27