2012-06-17 168 views
2

我剛開始學習Symfony 2教程。我創建了一個包含用戶類的包,並試圖按照說明設置登錄過程。我想我快到了,但是我現在正處於最後一個障礙。Symfony2 - 成功登錄後重定向

我已成立了一個包:丹\ AuthBundle,其中包含我的用戶類和另一束:丹\ HelloBundle我想只允許用戶訪問記錄。

我security.yml文件如下:

security: 
    encoders: 
     Dan\AuthBundle\Entity\User: sha512 

    providers: 
     main: 
      entity: { class: Dan\AuthBundle\Entity\User, property: username } 
     administrators: 
      entity: { class: DanAuthBundle:User } 

    firewalls: 
     secured_area: 
      pattern: ^/* 
      form_login: 
       check_path: /login_check 
       login_path: /login 
       always_use_default_target_path: false 
       default_target_path: /hello 

    access_control: 
     - { path: ^/hello/.* } 

主要的routing.yml文件看起來是這樣的:

DanAuthBundle: 
    resource: "@DanAuthBundle/Resources/config/routing.yml" 
    prefix: /auth/ 

DanHelloBundle_homepage: 
pattern: /hello/ 
defaults: { _controller: DanHelloBundle:Default:index } 

login: 
    pattern: /login 
    defaults: {_controller: DanAuthBundle:Default:login } 

login_check: 
    pattern: /login_check 

我手動創建我的用戶類的幾個實例。

如果我嘗試訪問url/hello,我會正確重定向到登錄頁面。如果輸入的信息不正確,我會在模板中獲得正確的消息,但是,當我使用正確的詳細信息登錄時,會收到324(空響應)錯誤(此時,瀏覽器中顯示的URL是login_check)。

從閱讀文檔,我認爲我應該重定向到我最初嘗試訪問的頁面?

http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form

默認情況下,如果提交的證書是正確的,用戶將 重定向到被請求的原始頁面(例如/管理/富)。 如果用戶最初直接進入登錄頁面,他會將 重定向到主頁。這可以高度自定義,例如,允許您將 重定向到特定的URL。

此外,如果我在輸入正確的詳細信息後嘗試訪問該頁面,我將再次被重定向到登錄頁面。

任何人都可以看到我是否錯過了任何明顯的東西?

這是我的日誌文件:

[2012-06-18十八點33分47秒] doctrine.DEBUG:SELECT t0.id AS ID1,t0.username AS USERNAME2,t0.salt AS salt3,t0.hashed_pa​​ssword AS hashed_pa​​ssword4 FROM User t0 WHERE t0.username =? ([「hello」])[] [] [2012-06-18 18:33:47] security.INFO:用戶「hello」已成功驗證 [] [] [2012-06-18 18:33 :47] event.DEBUG:Listener 「Symfony \ Component \ Security \ Http \ Firewall :: onKernelRequest」已停止 事件「kernel.request」的傳播。 [] [] [2012-06-18 18點33分47秒] event.DEBUG:監聽 「的Symfony \包\ FrameworkBundle \事件監聽\ RouterListener」 沒有 呼籲事件 「kernel.request」。 [] [] [2012-06-18 18點33分47秒] event.DEBUG:監聽 「的Symfony \包\ AsseticBundle \事件監聽\ RequestListener」 沒有 呼籲事件 「kernel.request」。 [] [] [2012-06-18 18點33分47秒] event.DEBUG:認證事件 「kernel.response」 監聽器 「的Symfony \分量\安全\ HTTP \防火牆\ ContextListener :: onKernelResponse」。 [] [] [2012-06-18 18點33分47秒] security.DEBUG:在 收件SecurityContext的會話[] []

任何意見理解。

謝謝。

+1

你可以嘗試添加一個登錄監聽器重定向用戶:http://www.metod.si/login-event-listener-in-symfony2/ – Snroki

+0

這裏也是我的回答與target_path: http://stackoverflow.com/a/17424321/1866083 – nvvetal

回答

4

您需要2位聽衆。

  • 一個在會議最後一頁設置

  • 二succesfull登錄

後重定向鏈接將解決你的問題:http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

+0

嗨,這是最近改變了什麼嗎?我從文檔中添加了引用,使我相信它會自動重定向。文檔不再正確嗎? – Dan

+2

嗨_target_path是簡單的解決方案,但是當您需要在其他控制器中重定向時(例如,當用戶轉到另一個角色時,有這些偵聽器是有用的)。 –

7
// if you're using Symfony 2.0 
$key = '_security.target_path'; 
// if you're using Symfony 2.1 or greater 
// where "main" is the name of your firewall in security.yml 
$key = '_security.main.target_path'; 

// try to redirect to the last page, or fallback to the homepage 
if ($this->container->get('session')->has($key)) { 
    $url = $this->container->get('session')->get($key); 
    $this->container->get('session')->remove($key); 
} else { 
    $url = $this->container->get('router')->generate('homepage'); 
} 

return new RedirectResponse($url); 
-3

只是使用的getUser檢查您的相應操作(您正在呈現登錄表單的位置)視圖)如下:

if($this->getUser()){ return $this->redirect($this->generateUrl('your-redirect-path-alise')); }

+0

從Symfony文檔中,不要檢查User對象以查看它們是否已登錄:http://symfony.com/doc/current/book/security.html#always-check-if-the-user- IS-登錄 – Aerendir