2011-11-10 54 views
1

我正在使用Symfony-2來實現我的應用程序。
我需要我的登錄和註銷路線才能擁有一些佔位符,但我無法在routing.ymlsecurity.yml文件中很好地定義它。

我想有這樣的:
www.mysite.com/{client_slug}/panelSymfony-2>帶佔位符的登錄和註銷路線

,並在它的其他受保護的頁面:
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=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 } 

任何想法?

+0

請發佈您的routing.yml和security.yml文件的相關*位,以便我們確保您的訪問控制和防火牆設置正確。 – richsage

+0

只需將相關部分添加到原始問題中即可。 – guyaloni

+0

''_client_slug'''包含什麼? –

回答

1

我有完全相同的問題。我已經閱讀了這裏的所有內容(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_path定義:

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

login_check: 
    pattern: /{_client}/login_check 

而且我做了一個事件監聽,這將在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。

+0

Manixx;你根本沒有糟糕的英語*!你寫得比很多母語人士都好。我正在消除你的道歉,因爲它確實是完全沒有必要的。 –