Я определяю безопасность для моего сайта в 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')")
*/
Все ответы от @ turdaliev-nursultan работы.
Но если вы знаете, что {id}
Параметр всегда будет целым числом, возможен дополнительный ответ.
Вы можете редактировать security.yml
файл и добавьте следующее правило в access_control
список:
- { path: ^/ad/[0-9]+/contact$, role: ROLE_USER }
[0-9]+
part означает любую строку, состоящую из одной или нескольких цифр от 0 до 9.
Имейте также в виду, что используя любой URL, как http://example.com/ad/foo/contact
где параметр не является существующим идентификатором, приведет к ошибке http 404.