Php 使用HWIOAuthBundle的Symfony2自定义提供程序挑战

Php 使用HWIOAuthBundle的Symfony2自定义提供程序挑战,php,facebook,symfony,oauth,facebook-oauth,Php,Facebook,Symfony,Oauth,Facebook Oauth,目标:与OAuth提供商(如facebook)建立auth系统 解决方案:我安装并设置了HWIOAuthBundle,创建了自定义用户类,一切都正常工作并经过身份验证。所以,在从oauth提供程序安全层回调请求提供程序从数据库加载用户的loadUserByOAuthUserResponse方法后 问题是:。。。但当symfony试图验证用户身份时,它实际上调用了loadUserByUsername方法的提供程序,并且只传递带有用户名的字符串。但facebook并没有返回用户名提供者,它实际上是返

目标:与OAuth提供商(如facebook)建立auth系统

解决方案:我安装并设置了HWIOAuthBundle,创建了自定义用户类,一切都正常工作并经过身份验证。所以,在从oauth提供程序安全层回调请求提供程序从数据库加载用户的loadUserByOAuthUserResponse方法后

问题是:。。。但当symfony试图验证用户身份时,它实际上调用了loadUserByUsername方法的提供程序,并且只传递带有用户名的字符串。但facebook并没有返回用户名提供者,它实际上是返回资源用户名,看起来像10152039919326906,并将NULL传递给用户名。当安全层请求loadUserByUsername时,它使用NULL参数调用它

以下是dev的部分代码:

class OAuthUserProvider implements UserProviderInterface, OAuthAwareUserProviderInterface 
{

  protected $em;
  protected $className;
  protected $repository;

  function __construct(ManagerRegistry $registry, $className) {
    $this->em = $registry->getManager();
    $this->repository = $this->em->getRepository($className);
    $this->className = $className;
  }

  public function loadUserByOAuthUserResponse(UserResponseInterface $response)
  {
    $username = $response->getUsername();
    $nickname = $response->getNickname();
    $realname = $response->getRealName();
    $email    = $response->getEmail();

    $resourceOwnerName = $response->getResourceOwner()->getName();

    $user = $this->repository->findOneBy(
      array('resource' => $resourceOwnerName, 'resourceUsername' => $username)
    );

    if (null === $user) {
      $user = new $this->className;
      $user->setUsername($nickname);
      $user->setResourceUsername($username);
      $user->setResource($resourceOwnerName);
      $user->setRealname($realname);
      $user->setEmail($email);
      $user->setLastLogin(new \DateTime());

      // facebook crutch
      if (null == $user->getUsername()) {
        $user->setUsername($username);
      }

      $this->em->persist($user);
      $id = $this->em->flush();
    }

    if ($user) {
      return $user;
    }
  }

  public function loadUserByUsername($username) {

    $user = $this->repository->findOneBy(array('username' => $username));
    if (!$user) {
        throw new UsernameNotFoundException(sprintf("User '%s' not found.", $username));
    }

    return $user;
  }
所以,我想,我需要一根拐杖,如果用户名为空,它将传递到loadUserByUsername电子邮件或其他字段,并将其重写为搜索数据库,而不仅仅是用户名字段

有很多类似的情况会因为loadUserByUsername而崩溃。例如,twitter誓言不会返回电子邮件,而是返回用户名。有没有办法重写loadByUsername调用的接口