Задать вопрос
@Mysterion

Какая хорошая практика для определения доступа к записи в Symfony 4?

Всем привет.

Доступ к страницам в целом определен через security.yaml:
access_control:
        - { path: ^/cp/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/cp/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/cp/forgot-password, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/console, roles: IS_AUTHENTICATED_FULLY }

Таким образом, доступ ко всем роутам /console есть только у авторизованных пользователей.
Но есть роут /console/{item<[1-9]\d*>}, где доступ должен быть только у владельца записи в базе. У этих записей есть колонка user_id, где определяется владелец через связь many-to-one.
Вот сам метод контроллера:
/**
     * @Route("/{item<[1-9]\d*>}", name="console_item")
     */
    public function actionConsoleItem(Console $console)
    {
        return $this->render('console/console_item.html.twig', [
            'console' => $console,
        ]);
    }

Таким образом через ParamConverter берется запись из базы по параметру item, но как проверить соответствует ли значение из user объекту $this-getUser()?

Может есть какая-то возможность для класса контроллера в целом указать метод определения наличия доступа?
В этом же контроллере у меня есть метод, где я вывожу все итемы пользователя по условию ['user' => $this->getUser()]

В Entity:
/**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="id")
     */
    private $user;
...
    public function getUser(): User
    {
        return $this->user;
    }

    public function setUser(User $user): self
    {
        $this->user = $user;

        return $this;
    }
  • Вопрос задан
  • 173 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
thewind
@thewind
php программист, front / backend developer
Может можно прямо в контроллере написать?
if ($this->getUser()->getId() !== $console->getUser()->getId()) {
    throw new UnauthorizedHttpException('Access denied');
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы