2016-01-18 3 views
1

Я определяющая безопасность для моего сайта в security.ymlконтроля доступа Symfony с переменным внутри маршрута

- { 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 ... вы действительно этого хотите? Почему бы не сделать параметр необязательным, если он может быть нулем – nixoschu

+0

Правда, он не должен быть нулевым. –

ответ

3

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

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

Обнаружено, что '^/ad/(.+)/контакт' также работает. Я знал большинство ваших вариантов и не хочу изменять свой маршрут. Использование аннотаций на самом деле не имеет смысла, поскольку я не хочу сочетать аннотации и .yml. Это либо одно, либо другое. –

+0

@GeorgeIrimiciuc, спасибо за совместное использование, я не знал об использовании regex в безопасности маршрутизации. Сегодня узнал что-то новое. –

2

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

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

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

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

[0-9]+ часть означает любую последовательность из одного или нескольких цифр от 0 до 9.

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

Смежные вопросы