Symfony-2> вход и выход из системы с заполнителями - PullRequest
1 голос
/ 10 ноября 2011

Я использую Symfony-2 для реализации своего приложения.Мне нужно, чтобы в моих маршрутах входа и выхода были некоторые заполнители, но мне не удается точно определить его в файлах routing.yml и security.yml .Я хочу иметь что-то вроде:
www.mysite.com/{client_slug}/panel

и под ним другие защищенные страницы:
www.mysite.com/{client_slug}/panel/.*

Когда кто-то пытается перейти на одну из этих страниц, он/ она должна быть перенаправлена ​​на:
www.mysite.com/{client_slug}/login

и после нажатия logout пользователь должен быть перенаправлен на что-то вроде:
www.mysite.com/{client_slug}/goodbye

Я попробовал несколько вещей (http://forum.symfony -project.org / viewtopic.php? F = 23 & 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 Ответ

3 голосов
/ 27 февраля 2013

У меня была точно такая же проблема.Я прочитал все здесь (http://forum.symfony -project.org / viewtopic.php? F = 23 & 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, который будет вызываться в ядре.событие запроса:

acme.system.client.listener:
        class: Acme\System\ClientBundle\EventListener\ClientListener
        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 вручную в маршрутизаторе-context:

public function onKernelRequest(GetResponseEvent $event) {

        $clientIdentifier = $event->getRequest()->attributes->get('_client');
        $this->router->getContext()->setParameter('_client', $clientIdentifier);

    }

И у меня это хорошо работает.

В настоящее время я использую Symfony 2.2.0-RC3.

...