1

我们正在使用 Symfony2 框架构建一个应用程序。

实现了一个自定义身份验证管理器,可以正常工作,除非用户连接并选择“记住我”令牌。用户登录后,可以导航抛出网站,过了一会儿,随机时间从大约 5 分钟到大约 1 小时(可能更长),出现以下异常:

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

此时“修复”此问题(并再次访问网站)的唯一解决方案是从浏览器中删除 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 回答