Symfony-2 > маршруты входа и выхода из системы с заполнителями

#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; у вас совсем не плохой английский! Вы пишете лучше, чем многие носители языка. Я удаляю ваши извинения, потому что это действительно совершенно не нужно.