首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony HWIOauthBundle,FOSUserBundle.完整性约束冲突: 1062个重复条目

Symfony HWIOauthBundle,FOSUserBundle.完整性约束冲突: 1062个重复条目
EN

Stack Overflow用户
提问于 2015-03-16 10:47:10
回答 3查看 1K关注 0票数 0

我已经试了一整天想弄清楚这件事。这样就可以了。

我正在使用Symfony version 2.6.4

我最初有一个使用friendsofsymfony/user-bundle": "2.0.*@dev的登录和注册表单

我刚刚添加了"hwi/oauth-bundle": "0.4.*@dev"来支持facebook的注册/登录。

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

代码语言:javascript
复制
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'

如果我使用常规表单注册,然后也使用常规表单签名,我会得到预期的“电子邮件已在使用”

如果我先注册facebook,然后登录facebook,它的工作没有问题。

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

无论哪种方式,我都不关心用户名。如果它更新到facebook提供的版本,那就太好了。我只使用电子邮件登录,但将用户名条目保留在数据库中,因为这是FOSUserBundle的标准设置

我已经遵循了这里的说明:https://gist.github.com/danvbe/4476697

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

任何帮助都将不胜感激。乐于发布配置信息或代码,如果要求。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-03-18 06:02:05

已解决的

我不得不重写HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider

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

但是,我必须定制loadUserByOAuthUserResponse方法来满足我的需求。

父方法期望数据库中的任何现有用户先前也已添加了来自OAuth响应的相同信息

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

代码语言:javascript
复制
/**
 * {@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
EN

Stack Overflow用户

发布于 2015-03-16 17:03:12

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

app/config/config.yml

代码语言:javascript
复制
framework:
  validation:
     enabled: true
     api: 2.4
     enable_annotations: true # Provided already by when first installing Symfony

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

票数 0
EN

Stack Overflow用户

发布于 2020-10-19 22:57:51

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

代码语言:javascript
复制
$user->setUsername($email);

对我很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29068910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档