5

我正在尝试使用 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);
4

2 回答 2

7

您需要发生 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);
于 2013-03-13T18:19:33.097 回答
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));

感谢我的一位同事为我指出这一点。

于 2015-11-03T04:45:35.993 回答