Я определяю безопасность своего сайта в 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}
Не будет работать для незарегистрированных пользователей.
У меня есть два решения для вас.
Во-первых, добавьте 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')")
*/
^/ad/(.+)/contact
, что ^/ad/(.+)/contact
также работает в то же время. Я знал большинство твоих выборов и не хочу изменять мой маршрут. Использование аннотаций не имеет смысла, так как я не хочу объединять аннотации и .yml. Это либо один, либо другой.
Все ответы от работы @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.