1

Symfony2 フレームワークを使用してアプリケーションを構築しています。

ユーザーが接続して「Remember me」トークンを選択した場合を除いて、正常に動作するカスタム認証マネージャーが実装されています。ユーザーがログインし、Web サイトをナビゲートできるようになり、約 5 分から約 1 時間 (場合によってはそれ以上) の範囲でランダムな時間が経過すると、次の例外が発生します。

The UserProviderInterface implementation must return an instance of UserInterface, but returned "Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices".

この時点でこれを「修正」する (そして再度 Web サイトにアクセスする) ための唯一の解決策は、rememberme トークンをブラウザーから削除することです。

この問題に関する提案はまだ実際には見つかりませんでしたので、誰かがすでに問題に遭遇した場合に備えて、ここで質問するかもしれないと思いました.

前もって感謝します。

4

1 に答える 1

0

ユーザープロバイダーは、ユーザーが見つからない場合にインスタンスを返すか\Symfony\Component\Security\Core\User\UserInterface、スローする必要があります。\Symfony\Component\Security\Core\Exception\UsernameNotFoundException他には何もありません。

私の場合、次のようになります。

public function loadUserByUsername($loginOrEmail)
{
    $qb = $this->dm
        ->getRepository('MyBundle:User')
        ->createQueryBuilder('u');

    $qb->where()->orX()
        ->eq()->localName('u')->literal($loginOrEmail)->end()
        ->eq()->field('u.email')->literal($loginOrEmail);

    $user = $qb->getQuery()->getOneOrNullResult();

    if (!$user) {
        throw new UsernameNotFoundException(sprintf('User "%s" not found.', $loginOrEmail));
    }

    return $user;
}

このアプローチは、すべての問題を解決します。よく見て\Symfony\Bridge\Doctrine\Security\User\EntityUserProvider

それが少し役立ったことを願っています:)

于 2015-09-17T10:25:16.637 に答える