Контроль доступа Symfony с переменной внутри маршрута

1

Я определяю безопасность своего сайта в security.yml

    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/ad/new, role: ROLE_USER  }
    - { path: ^/myAds, role: ROLE_USER  }
    - { path: ^/payments, role: ROLE_USER  }
    - { path: ^/pay, role: ROLE_USER  }

Но я не уверен, как такой маршрут будет добавлен здесь:

mybundle_contact_advertiser:
   path:    /ad/{id}/contact
   defaults:   { _controller: MyBundle:Default:contactAdvertiser,id:null}

Как определяется id, учитывая, что я не могу сделать это так:

    - { path: ^/ad, role: ROLE_USER  }

Как маршрут, как

mybundle_ad:
    path:      /ad/{id}
    defaults:  { _controller: MyBundle:Default:viewAd ,id:null}

Не будет работать для незарегистрированных пользователей.

  • 0
    вам не нужно добавлять каждый маршрут в security.yml, есть подстановочные знаки, которые будут работать так же, как в регулярном выражении, для сканирования, какая часть маршрутов нуждается в аутентифицированном пользователе, а какая - нет ... и кроме того, если вы добавили параметр в середина вашего маршрута, которая может быть нулевой, ваш маршрут может быть / ad / null / contact ... вы действительно этого хотите? Почему бы не сделать параметр необязательным, если он может быть нулевым
  • 0
    Правда, оно не должно быть нулевым.
Теги:
symfony-security

2 ответа

4
Лучший ответ

У меня есть два решения для вас.

Во-первых, добавьте prefix к маршрутам, которым нужна аутентификация и авторизация. Затем просто добавьте этот prefix в ваш файл security.yml. Таким образом, вам не нужно добавлять все маршруты вручную.

Во-вторых, измените свой маршрут на:

mybundle_contact_advertiser:
   path:    /ad/contact/{id}
   defaults:   { _controller: MyBundle:Default:contactAdvertiser}

Затем добавьте следующее в файл security.yml:

- { path: ^/ad/contact/, role: ROLE_USER  }

Но если вы не хотите менять маршрут, проверьте авторизацию внутри своего action

 $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');

Или

if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
    throw $this->createAccessDeniedException();
}

И последнее, но не менее важное: вы можете использовать аннотацию @Security для защиты ваших действий.

/**
 * @Security("has_role('ROLE_USER')")
 */
  • 3
    ^/ad/(.+)/contact , что ^/ad/(.+)/contact также работает в то же время. Я знал большинство твоих выборов и не хочу изменять мой маршрут. Использование аннотаций не имеет смысла, так как я не хочу объединять аннотации и .yml. Это либо один, либо другой.
  • 0
    @ GeorgeIrimiciuc, спасибо, что поделились, я не знал об использовании регулярных выражений в безопасности маршрутизации. Узнал что-то новое сегодня.
3

Все ответы от работы @turdaliev-nursultan.

Но если вы знаете, что параметр {id} всегда будет целым числом, есть еще один возможный ответ.

Вы можете отредактировать файл security.yml и добавить в список access_control следующее правило:

- { path: ^/ad/[0-9]+/contact$, role: ROLE_USER }

Часть [0-9]+ означает любую строку, состоящую из одной или нескольких цифр от 0 до 9.

Имейте в виду, что с использованием любого URL-адреса, такого как http://example.com/ad/foo/contact, где параметр не является существующим идентификатором, приведет к ошибке http 404.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню