2013-03-09 18 views
4

我正在嘗試使用symfony2和特殊類型的URL進行自動登錄。就像described here通過使用symfony2的URL自動登錄

但是,當我使用symfony2調試工具欄,我注意到它說:「未驗證」。但我有一個會話,我有一個用戶對象,它似乎工作得很好。爲什麼調試工具欄會這樣說?

zadbuchy描述的方法有什麼問題嗎?我正在使用symfony 2.1.6。

編輯:我知道這可能不是'最安全'的登錄方式(感謝@Bart的討論),但我很好奇爲什麼symfony2無法正確識別登錄。

我的代碼如下所示:

$firewall = "support_secured_area"; 
$token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles()); 
$this->get('security.context')->setToken($token); 
$session = $this->get('session'); 
$session->set('_security_'.$firewall, serialize($token)); 

// Fire the login event (Suggestion from the answer, but unfortunately it doesn't work :(). 
$event = new InteractiveLoginEvent($this->getRequest(), $token); 
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event); 
+2

我可以補充一點,這似乎不是一種非常安全的方式來驗證用戶。 – Bart 2013-03-09 14:37:53

+0

感謝您的評論。我在設計時考慮過。我知道安全問題,但替代方案(寫電子郵件)同樣安全(因爲S/MIME和GnuPG不適用)。 主要用途是提供一種簡單的方式來請求票證和查看票證狀態。所以我認爲沒關係。 – 2013-03-09 15:19:16

+0

並非完全如此。電子郵件大多是一次性事件。用戶應該能夠更改他們的密碼,並且如果通過郵件發送,可以鼓勵他們這樣做。這對於固定的URL是不可能的。您可以更改網址,但與使用用戶名進行身份驗證一樣安全。 – Bart 2013-03-09 15:23:32

回答

6

您需要InteractiveLoginEvent發生的待登錄用戶

// Here, "public" is the name of the firewall in your security.yml 
$token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles()); 
$this->get("security.context")->setToken($token); 

// Fire the login event 
$event = new InteractiveLoginEvent($request, $token); 
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event); 
+0

'$ user'從哪裏來? – Henry 2017-10-25 00:29:48

1
$token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles()); 
$this->get('security.context')->setToken($token); 
$session = $this->get('session'); 
$session->set('_security_'.$firewall, serialize($token)); 

我申請上述溶液中一對夫婦的我們。項目。一個人工作,但另一個沒有。

最終的解決方案是在下面一行中使用security_context_name而不是firewall_name。然後它對每個項目都起作用。

$session->set('_security_'.$security_context_name, serialize($token)); 

感謝我的一位同事爲我指出了這一點。