Symfony HWIOauthBundle,FOSUserBundle。完整性约束违规:1062重复条目

时间:2015-03-16 02:47:10

标签: php symfony doctrine fosuserbundle hwioauthbundle

我整天都试着想出这个。所以这里。

我正在使用Symfony version 2.6.4

我最初使用friendsofsymfony/user-bundle": "2.0.*@dev

登录和注册表单

我刚刚添加"hwi/oauth-bundle": "0.4.*@dev"以允许facebook注册/登录。

问题是,如果我使用我的常规表单注册,然后尝试使用facebook登录,我会收到以下错误。 (我为显示目的更改了一些值):

An exception occurred while executing 'INSERT INTO users (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, locked, expired, expires_at, confirmation_token, password_requested_at, roles, credentials_expired, credentials_expire_at, facebook_id, facebook_access_token) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["10155387178995713", "10155387178995713", "someemail@hotmail.com", "someemail@hotmail.com", 1, "fgf90m9yxzc4ggkgwg8cgk0g4sk0ocg", "10155345628995713", null, 0, 0, null, null, null, "a:0:{}", 0, null, "10155387178995713", "CAALREhhNZBmEBANQjAMjlrAHZduiwOidsUyVwCI0hQkSj7W9imZC2xlL76jGH3MA10yUBkF2kSCpr9OdBbUSPoKkriZA2FdVlAhFsfXBNjBYiywzodiWYKGrcVMVsMVIVbk6XDUFVDtighTDYKuT9fZBm96VUSZBNSOE92RJMNwtAZCwBKrerAKGB11gNLNqDzNOfnBgih6TQDhacd9xSOC"]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'someemail@hotmail.com' for key 'UNIQ_1483A5E9A0D96FBF'

如果我使用常规表单进行注册,然后使用常规表单进行签名,我就会得到预期的#34;电子邮件已经在使用"

如果我首先使用Facebook注册然后使用Facebook登录,那么它可以正常运行。

使用标准登录表单时的用户名/ username_cononical设置与使用facebook注册时不同。目前,正常登录表单下的用户名生成一个随机字符串。

我不关心用户名。如果它更新到facebook给出的那个很棒。我只使用电子邮件登录,但将用户名条目保留在数据库中,因为它是FOSUserBundle的标准

我已按照此处的说明操作:https://gist.github.com/danvbe/4476697

我也读过这个:http://m2mdas.github.io/blog/2013/11/21/integrate-hwioauthbundle-with-fosuserbundle/但仍然没有运气。

任何帮助都会非常感激。很高兴在需要时发布配置信息或代码。

感谢

3 个答案:

答案 0 :(得分:1)

<强>解决

我不得不覆盖HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider

如此处所述:https://gist.github.com/danvbe/4476697

但是我必须自定义loadUserByOAuthUserResponse方法以满足我的需求。

父方法预计数据库中的任何现有用户之前也已使用OAuth响应中的相同信息添加

在我的特定情况下,我必须执行以下操作:

/**
 * {@inheritdoc}
 */
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
    $username = $response->getUsername();
    $email = $response->getEmail();

    /** @var \AppBundle\Entity\User $user */
    $user = $this->userManager->findUserByEmail($email);

    $serviceName = $response->getResourceOwner()->getName();
    $setter = 'set'.ucfirst($serviceName);
    $setter_id = $setter.'Id';
    $setter_token = $setter.'AccessToken';
    $getter = 'get'.$serviceName;
    $getter_id = $getter.'Id';
    $getter_token = $getter.'AccessToken';

    //when the user is registering
    if (null === $user) {
        // create new user here
        $user = $this->userManager->createUser();
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());
        $user->setEmail($email);
        $user->setPassword($this->generatePassword(12));
        $user->setEnabled(true);
        $this->userManager->updateUser($user);
        return $user;
    }
    //if user exists

    if($user->$getter_id() == ""){
        $user->$setter_id($username);
    }

    //update access token
    $user->$setter_token($response->getAccessToken());

    return $user;
}

答案 1 :(得分:0)

在以前的symfony 2.5中有一个验证错误,你可能想尝试在config.yml中使用2.4进行验证,如果它解决了问题。

的应用程序/配置/ config.yml

framework:
  validation:
     enabled: true
     api: 2.4
     enable_annotations: true # Provided already by when first installing Symfony

https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1516

答案 2 :(得分:0)

对于5年后可能会遇到此问题的人, 您可能需要设置用户名:

$user->setUsername($email);

为我工作。