私は他のものよりも前にいくつかのバリデーションなどを行うイベントリスナーを使用しています。 1つは、基本認証ユーザー(PHP_AUTH_USER
)が設定されている場合、ユーザーに「内部的に」ログインすることです。プログラムでsymfonyのユーザにログインするにはリフレッシュが必要です
PHP_AUTH_USER
はイベントがであなたをログに記録され発射される設定されている場合:戻る私の要求リスナーで
private function authenticate()
{
if($this->container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
return ;
}
$token = new UsernamePasswordToken(
$this->username, // = PHP_AUTH_USER
$this->password,
$this->container->getParameter('fos_user.firewall_name'),
$this->user->getRoles()
);
$tokenStorage = $this->container->get('security.token_storage');
$tokenStorage->setToken($token);
$event = new InteractiveLoginEvent($this->req, $token);
$this->container->get("event_dispatcher")->dispatch("security.interactive_login", $event);
return true;
}
私が認証user
オブジェクトを取得したいのですが、限り、私はリダイレクトされませんよう(ユーザーが実際にログインしていないページを表示したり更新したりすることができます(下記参照)。だから私のログインイベントが発生した後、私はこれを実行する必要があります。
$user = $this->container->get('security.token_storage')->getToken()->getUser();
if(! $user instanceof User) {
$event->setController(function() use (&$router) {
return new RedirectResponse($router->generate('homepage'));
});
}
興味深いことに、ここ$user
変数は、ユーザー名を含む単なる文字列です。すべてをリダイレクトした後は、それはオブジェクトです。
実際のUser
オブジェクトがgetUser
から取得されない限り、多くのメソッドとルートは、User
オブジェクトを取得することに依存しているため動作しません。
:ユーザオブジェクトを手動で割り当てることで修正しました。
$userEntity = $this->em->getRepository('AppBundle:User')->findOneBy(['username' => $user]);
$this->container->get('security.token_storage')->getToken()->setUser($userEntity);
あなたは '$ユーザ=の$ this - >、コンテナ>取得( 'security.token_storage')試してみました - >入手トークン() - > getUserメソッド() - >のGetRecordを();'? – Rooneyl
getUser()は文字列 'getRecord'を返すので、文字列に関数を呼び出すことを意味します。あなたがトークン 'UsernamePasswordToken'を作成するときに' – nehalist
メンバ関数を呼び出してgetRecord()を呼び出すと、それはトークンコンストラクタのユーザ名ではなくユーザオブジェクトを使用する場合に機能するかどうかをテストしました。例えば。 ($ userObject、null、$ this-> container-> getParameter( 'fos_user.firewall_name')、$ userObject-> getRoles()); '$ token = new UsernamePasswordToken – Rooneyl