Symfony - Доступ только для своих клиентов

У меня есть эти сущности

User

(ManyToMany)

Customer (OneToOne --> a customer can have a related customer)

Мое приложение работает. Теперь я хочу управлять разрешениями. Когда пользователь вошел в систему, я хочу отображать только клиентов, связанных с ним, и клиентов, связанных с детьми-клиентами.

Например,

  • Каждый раз, когда я использую findAll (), он находит своих клиентов.

  • Маршрут / пользователь / 4 / клиент / 7: если клиент 7 не связан с пользователем, в разрешении отказано

Думаю, мне нужно переопределить репозиторий доктрины или использовать EntityManagerDecorator Я просто спрашиваю, как лучше всего это понять? Спасибо !

Прочтите это: symfony.com/doc/current/security/voters.html

Zorpen 10.01.2019 18:31

Спасибо, избирателей не знал. Я буду использовать его в качестве дополнения к своему проекту, но он не даст того, что мне нужно в моем вопросе.

Guillaume Harari 11.01.2019 15:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

По сути, такие операции, как поиск определенных данных, следует делегировать в репозиторий. В конце концов, если вам придется искать в другом источнике данных, вы можете создать службу для этой конкретной ответственности и внедрить туда необходимые зависимости. В вашем случае я бы сказал, что вам не нужно ничего контролировать, просто создайте UserRepository и напишите там функцию, которая сделает то, что вам нужно.

Проверь это: https://symfony.com/doc/3.3/doctrine/repository.html

Почему бы вам не создать свою собственную функцию findAll () в вашем customerRepository, которая фильтрует вместе с вашим пользователем?

Что-то типа

public function findAllRelatedToUser(User $user)
{
    return $this->createQueryBuilder('c')
                    ->innerJoin('c.user', 'u')
                    ->andWhere('u.id = :user_id')
                    ->setParameter('user_id', $user->getId())
                    ->getQuery()
                    ->getResult();
}

Привет, да, это хорошая идея, но это старый проект, и у меня много репозиториев и много findAll, findBy и т. д. Во многих контроллерах. Но я думаю, что сделаю так, как ты говоришь

Guillaume Harari 11.01.2019 15:18
Ответ принят как подходящий

Наконец-то я нашел способ получше.

Доктрина фильтры

Запрос на прослушивание в ядре, если это касается моей сущности, примените мой фильтр (добавив WHERE id = xx)

Я использую это: http://blog.michaelperrin.fr/2014/12/05/doctrine-filters/

Другие вопросы по теме