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