5

symfony2と特別な種類のURLで自動ログインを行おうとしています。ここで説明したように。

しかし、symfony2デバッグツールバーを使用すると、「認証されていません」と表示されていることに気付きます。しかし、セッションがあり、ユーザーオブジェクトがあり、すべて正常に機能しているようです。デバッグツールバーがこれを言っているのはなぜですか?

そして、zadbuchyが説明している方法に何か問題がありますか?symfony2.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));

上記のソリューションをいくつかのプロジェクトに適用しました。1つは機能しましたが、もう1つは機能しませんでした。

最終的な解決策は、以下の行のfirewall_nameの代わりにsecurity_context_nameを使用することです。その後、すべてのプロジェクトで機能しました。

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

同僚の一人が私にそれを指摘してくれてありがとう。

于 2015-11-03T04:45:35.993 に答える