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

Я определяю безопасность для моего сайта в 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}

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

1

Решение

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

Сначала добавьте 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')")
*/
4

Другие решения

Все ответы от @ 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.

4

По вопросам рекламы [email protected]