15

ログインプロセス中にユーザーがプロファイルを選択する必要がある Symfony 2 アプリケーションに取り組んでいます。

ユーザーは、作業するプロファイルを複数持っている場合があり、自分のプロファイルしか知りません。最初に、ユーザー名とパスワードの入力を求める必要があります。それらが正しい場合は、ユーザーにログインするべきではありません。ユーザーがセッション中に使用するプロファイルを求める必要があります。

そこで、ユーザー名とパスワードのフィールドを含むフォームを表示し、それを Ajax リクエストを使用して送信します。ユーザー名とパスワードが正しい場合はプロファイル リストが返され、そうでない場合はエラー コードが返されます。最後に、ユーザーはユーザー名、パスワード、およびプロファイルを使用してシステムにログインします。

問題は、認証データが正しいかどうか (すべての認証マネージャー、ユーザー プロバイダーなどを使用して) を確認して、実際にユーザーをログに記録せずにこの中間ステップ (プロファイルのプロンプト) を実行する方法がわからないことです。

誰でもこれで私を助けることができますか?

4

6 に答える 6

17

このようなことをしてユーザーを取得し、手動でパスワードをテストすることができます-

$username = trim($this->getRequest()->query->get('username'));
$password = trim($this->getRequest()->query->get('password'));

$em = $this->get('doctrine')->getEntityManager();
$query = $em->createQuery("SELECT u FROM \Some\Bundle\Entity\User u WHERE u.username = :username");
$query->setParameter('username', $username);
$user = $query->getOneOrNullResult();

if ($user) {
  // Get the encoder for the users password
  $encoder_service = $this->get('security.encoder_factory');
  $encoder = $encoder_service->getEncoder($user);
  $encoded_pass = $encoder->encodePassword($password, $user->getSalt());

  if ($user->getPassword() == $encoded_pass) {
    // Get profile list
  } else {
    // Password bad
  }
} else {
  // Username bad
}

クライアントからプロファイルを取り戻したら、AJAXサーバーコントローラーで手動でログインを簡単に実行することもできます-

// Get the security firewall name, login
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$token = new UsernamePasswordToken($user, $password, $providerKey, $user->getRoles());
$this->get("security.context")->setToken($token);

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

いくつかの使用ラインが必要な場合があります-

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
于 2012-07-10T03:43:49.153 に答える