#security #symfony #routing #placeholder
#Безопасность #symfony #маршруты #плейсхолдер
Вопрос:
Я использую Symfony-2 для реализации своего приложения.
Мне нужно, чтобы в моих маршрутах входа и выхода из системы было несколько заполнителей, но мне не удается правильно определить это в маршрутизации.yml и безопасность.файлы yml.
Я хочу иметь что-то вроде:
www.mysite.com/{client_slug}/panel
и под ним другие защищенные страницы:
www.mysite.com/{client_slug}/panel/.*
Когда кто-то пытается перейти на одну из этих страниц, он / она должен быть перенаправлен на:
www.mysite.com/{client_slug}/login
и после нажатия кнопки выхода пользователь должен быть перенаправлен на что-то вроде:
www.mysite.com/{client_slug}/goodbye
Я попробовал несколько вещей (http://forum.symfony-project.org/viewtopic.php?f=23amp;t=37809) но на данный момент единственное, чего я добился, это того, что в моем URL-адресе для входа появляется текст {client_slug}:
www.mysite.com/my-cliend-slug/panel
перенаправляет на
www.mysite.com/{client_slug}/login
security.yml
firewalls:
main:
pattern: /.*
form_login:
check_path: /login_check
login_path: _security_login
logout:
path: /logout
target: /goodbye
security: true
anonymous: true
routing.yml
_security_login:
pattern: /{_client_slug}/login
defaults: { _controller: MyAppBackendBundle:Security:login }
_security_check:
pattern: /login_check
_security_logout:
pattern: /logout
_admin_panel:
pattern: /{_client_slug}/panel
defaults: { _controller: MyAppBackendBundle:AdminPanel:index }
Есть идеи?
Комментарии:
1. Пожалуйста, опубликуйте соответствующие фрагменты вашего маршрута. yml и безопасность. файлы yml, чтобы мы могли убедиться, что ваш контроль доступа и брандмауэры настроены правильно.
2. Просто добавлены соответствующие части к исходному вопросу.
3. Что должно
_client_slug
содержать?4. Это строка с заменой имени клиента. Приложение имеет панели для каждого клиента, и URL-адрес должен содержать его slug. Например, если клиент называется «Маноло и сыновья», слаг будет просто manolo-and-sons. Он будет работать в течение всего сеанса для проверки доступа к различным модулям.
Ответ №1:
У меня была точно такая же проблема. Я прочитал все отсюда (http://forum.symfony-project.org/viewtopic.php?f=23amp;t=37809 ) и для меня это работает с несколькими дополнительными строками.
Вот мой security.yml
login_area:
pattern: ^/[A-Za-z0-9-_] /login$
anonymous: ~
secured_area:
pattern: ^/[A-Za-z0-9-_] /.*
form_login:
login_path: login
check_path: login_check
logout:
path: logout
target: /
remember_me:
key: "%secret%"
lifetime: 31536000
path: /
domain: ~
Определения login и login_path:
login:
pattern: /{_client}/login
defaults: { _controller: GNCApplicationBaseBundle:Security:login }
login_check:
pattern: /{_client}/login_check
И я создал EventListener, который будет вызываться при событии kernel.request:
acme.system.client.listener:
class: AcmeSystemClientBundleEventListenerClientListener
arguments: [@router, @doctrine.orm.entity_manager]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 10 }
Важным атрибутом является приоритет. В документации Symfony (http://symfony.com/doc/current/reference/dic_tags.html#kernel-event-listener ) это показывает, что RouterListener запускается с приоритетом 32, а брандмауэр — с 8. Поэтому я решил вызвать свой пользовательский EventListener прямо перед брандмауэром и вручную установить _client-атрибут в контексте маршрутизатора:
public function onKernelRequest(GetResponseEvent $event) {
$clientIdentifier = $event->getRequest()->attributes->get('_client');
$this->router->getContext()->setParameter('_client', $clientIdentifier);
}
И у меня это хорошо работает.
В настоящее время я использую Symfony 2.2.0-RC3.
Комментарии:
1. Manixx; у вас совсем не плохой английский! Вы пишете лучше, чем многие носители языка. Я удаляю ваши извинения, потому что это действительно совершенно не нужно.