Symfony-2>登录&使用占位符注销路由

时间:2011-11-10 10:26:19

标签: security symfony routing placeholder

我正在使用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)但是目前我唯一能做的就是在我的登录网址中显示 {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 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题。我已经从这里阅读了所有内容(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,它将在kernel.request事件中调用:

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属性 - 上下文:

public function onKernelRequest(GetResponseEvent $event) {

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

    }

它适用于我。

我目前正在使用Symfony 2.2.0-RC3。