Symfony-2 > login & logout routes with placeholders

北城以北 提交于 2019-12-08 08:28:29

问题


I am using Symfony-2 to implement my application.
I need my login and logout routes to have some placeholders, but I don't manage to define it well in routing.yml and security.yml files.

I want to have something like:
www.mysite.com/{client_slug}/panel

and under it other secured pages:
www.mysite.com/{client_slug}/panel/.*

When someone tries to navigate to one of these pages, he/she should be redirected to:
www.mysite.com/{client_slug}/login

and after clicking logout, user should be redirected to something like:
www.mysite.com/{client_slug}/goodbye

I tried several things (http://forum.symfony-project.org/viewtopic.php?f=23&t=37809) but at the moment the only thing I achieved was that in my login url the text {client_slug} appears:

www.mysite.com/my-cliend-slug/panel
redirects to
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 }

Any ideas?


回答1:


I had the exact same problem. I've read everything from here (http://forum.symfony-project.org/viewtopic.php?f=23&t=37809) and for me it works with a few extra lines.

Here is my 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:   ~

The login and login_path definitions:

login:
    pattern:  /{_client}/login
    defaults: { _controller: GNCApplicationBaseBundle:Security:login }

login_check:
    pattern:  /{_client}/login_check

And I made an EventListener, which will be called at the kernel.request event:

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 }

The important attribute is the priority. In the Symfony Documentation (http://symfony.com/doc/current/reference/dic_tags.html#kernel-event-listener) it shows that the RouterListener starts with a priority 32 and the Firewall at 8. So I choose to call my custom EventListener right before the Firewall and set the _client-attribute manually in the router-context:

public function onKernelRequest(GetResponseEvent $event) {

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

    }

And it works well for me.

I'm currently using Symfony 2.2.0-RC3.



来源:https://stackoverflow.com/questions/8078055/symfony-2-login-logout-routes-with-placeholders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!