无法识别的栏位:facebookId [英] Unrecognized field: facebookId

查看:99
本文介绍了无法识别的栏位:facebookId的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将Symfony 3与HWIOAUTH Bundle连接起来,并遵循教程 https://gist.github. com/danvbe/4476697 .

I try to connect symfony 3 with HWIOAUTH Bundle and follow the tutorial https://gist.github.com/danvbe/4476697.

文件 config.yml

hwi_oauth:
connect:
    account_connector: my_user_provider
firewall_names: [main]
fosub:

    username_iterations: 30


    properties:
        google: googleId
        facebook: facebookId
resource_owners:
    facebook:
        type:                facebook
        client_id:           ***************
        client_secret:       ***************
        scope:               ""
    google:
        type:                google
        client_id:           ***************
        client_secret:      ***************
        scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

security.yml

main:
        pattern:             .*
        context:             user
        form_login:
            provider:       fos_userbundle
            login_path:     /login
            use_forward:    false
            check_path:     /login_check
            failure_path:   null
            default_target_path: list_items
            always_use_default_target_path: true
        oauth:
            resource_owners:
                facebook:           "/connect/check-facebook"
                google:             "/connect/check-google"
            login_path:        /connect
            failure_path:      /connect

            oauth_user_provider:
                #this is my custom user provider, created from FOSUBUserProvider - will manage the
                #automatic user registration on your site, with data from the provider (facebook. google, etc.)
                service: my_user_provider
        logout:             true
        anonymous:          true

service.yml

my_user_provider:
    class: AppBundle\Entity\FOSUBUserProvider
    arguments: ['@fos_user.user_manager',{facebook: facebookId, google: googleId}]

请帮助我修复此错误.我花了很多次,但无法修复.

Please help me fix this bug. I spent many times but can't fix it.

更新: 实体用户

 /**
 * @var string
 *
 * @ORM\Column(name="facebookId", type="string", nullable=true)
 */
private $facebookId;

推荐答案

我使用symfony 3.3.15,这是正确的配置:

I use symfony 3.3.15 , this is correct configuration:

//User.php
<?php

namespace BackendBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * User
 *
 * @ORM\Table(name="fos_user")
 * @ORM\Entity
 */
class User extends BaseUser
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="facebook_id", type="string", length=255, nullable=true)
     */
    private $facebook_id;

    /**
     * @var string
     *
     * @ORM\Column(name="facebook_access_token", type="string", length=255, nullable=true)
     */
    private $facebook_access_token;

    /**
     * @var string
     *
     * @ORM\Column(name="google_id", type="string", length=255, nullable=true)
     */
    private $google_id;

    /**
     * @var string
     *
     * @ORM\Column(name="google_access_token", type="string", length=255, nullable=true)
     */
    private $google_access_token;


    /**
     * Set facebook_id
     *
     * @param string $facebook_id
     *
     * @return User
     */
    public function setFacebookId($facebook_id)
    {
        $this->facebook_id = $facebook_id;

        return $this;
    }

    /**
     * Get facebook_id
     *
     * @return string
     */
    public function getFacebookId()
    {
        return $this->facebook_id;
    }

    /**
     * Set facebook_access_token
     *
     * @param string $facebook_access_token
     *
     * @return User
     */
    public function setFacebookAccessToken($facebook_access_token)
    {
        $this->facebook_access_token = $facebook_access_token;

        return $this;
    }

    /**
     * Get facebook_access_token
     *
     * @return string
     */
    public function getFacebookAccessToken()
    {
        return $this->facebook_access_token;
    }

    /**
     * Set google_id
     *
     * @param string $google_id
     *
     * @return User
     */
    public function setGoogleId($google_id)
    {
        $this->google_id = $google_id;

        return $this;
    }

    /**
     * Get google_id
     *
     * @return string
     */
    public function getGoogleId()
    {
        return $this->google_id;
    }

    /**
     * Set google_access_token
     *
     * @param string $google_access_token
     *
     * @return User
     */
    public function setGoogleAccessToken($google_access_token)
    {
        $this->google_access_token = $google_access_token;

        return $this;
    }

    /**
     * Get google_access_token
     *
     * @return string
     */
    public function getGoogleAccessToken()
    {
        return $this->google_access_token;
    }

}

其他文件services.yml:

//services.yml
services:
    my_user_provider:
        class: AppBundle\Security\Core\User\FOSUBUserProvider
        arguments: ['@fos_user.user_manager',{facebook: facebook_id,google: google_id}]

下一个文件FOSUBUserProvider:

//Security/Core/User
<?php
namespace AppBundle\Security\Core\User;

use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;

class FOSUBUserProvider extends BaseClass
{
    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $username = $response->getUsername();

        $service = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($service);
        $setterId = $setter . 'Id';
        $setterToken = $setter . 'AccessToken';

        //disconnect previously connected user
        if (null !== $previousUser = $this->userManager->findUserBy(array($this->getProperty($response) => $username))) {
            $previousUser->$setterId(null);
            $previousUser->$setterToken(null);
            $this->userManager->updateUser($previousUser);
        }

        //connect current user
        $user->$setterId($username);
        $user->$setterToken($response->getAccessToken());

        $this->userManager->updateUser($user);
    }

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

        $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
        if (null === $user) {
            $user = $this->userManager->findUserByEmail($email);

            $service = $response->getResourceOwner()->getName();
            $setter = 'set' . ucfirst($service);
            $setterId = $setter . 'Id';
            $setterToken = $setter . 'AccessToken';

            if (null === $user) {
                $user = $this->userManager->createUser();
                $user->$setterId($username);
                $user->$setterToken($response->getAccessToken());

                $user->setUsername($username);
                $user->setEmail($email);
                $user->setPassword($username);
                $user->setEnabled(true);
                $this->userManager->updateUser($user);

                return $user;
            } else {
                $user->$setterId($username);
                $user->$setterToken($response->getAccessToken());

                $this->userManager->updateUser($user);

                return $user;
            }
        }

        //if user exists - go with the HWIOAuth way
        $user = parent::loadUserByOAuthUserResponse($response);

        $serviceName = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

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

        return $user;
    }
}

文件config.yml

fosub:
        username_iterations: 30
        properties:
            facebook:    facebook_id
            google:      google_id
    resource_owners:
        facebook:
            type:                facebook
            client_id:           gkhgkjgkjgkjgkj
            client_secret:       kjhkjkjhkjhlkjhlkjh
            #scope:               "email"
            #scope:               ""
            scope:               "email,public_profile,user_friends,user_birthday,user_location"

        google:
            type:                google
            client_id:           kjhlkjhlkjhljhlkjhlk-gkhjgkjhgkjhgkgjhkjhgkjgkjgkjh.apps.googleusercontent.com
            client_secret:       gjgjgj-hkjhgkhgkjh
            #scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
            scope:               "email profile"

下一个文件:security.yml

oauth:
                resource_owners:
                    facebook:           "/login/check-facebook"
                    google:             "/login/check-google"
                login_path:        /login
                failure_path: /login
                oauth_user_provider:
                    service: my_user_provider

致谢

这篇关于无法识别的栏位:facebookId的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆