使用带有FOSUserBundle的HWIOAuthBundle时出现“无法找到用户名”错误

时间:2016-07-28 19:32:31

标签: php fosuserbundle symfony hwioauthbundle

难倒在这里。使用HWIOAuthBundle允许在Symfony3上使用FOSUserBundle进行社交登录。

使用用户名和密码功能登录正常,但在使用社交登录进行身份验证时(在我的情况下,Facebook和LinkedIn),在重定向到登录页面时会返回错误“无法找到用户名”。

有什么想法吗?

相关文件的相关部分:

config.yml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: AppBundle\Entity\User

hwi_oauth:
    firewall_names: [secured_area]
    connect:
        account_connector: hwi_oauth.user.provider.fosub_bridge
        confirmation: true
    resource_owners:
        facebook:
            type:                facebook
            client_id:           xxx
            client_secret:       xxx
        linkedin:
            type:                linkedin
            client_id:           xxx
            client_secret:       xxx
    fosub:
        username_iterations: 30
        properties:
            facebook: facebookId
            linkedin: linkedinId

security.yml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false

        secured_area:
            anonymous: ~
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager
            oauth:
                resource_owners:
                    facebook:   "/login/check-facebook"
                    linkedin:   "/login/check-linkedin"
                login_path:     /login
                use_forward:    false
                failure_path:   /login
                check_path:     /login
                oauth_user_provider:
                    service: hwi_oauth.user.provider.fosub_bridge

            logout:
                path: /logout


        main:
            pattern: ^/
            logout:       true
            anonymous:    true


    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/connect$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

的routing.yml

fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

hwi_oauth_connect:
    resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml"
    prefix:   /login

hwi_oauth_login:
    resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
    prefix:   /login

hwi_oauth_redirect:
    resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
    prefix:   /login

facebook_login:
    path: /login/check-facebook

linkedin_login:
    path: /login/check-linkedin

user.php的

<?php
// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

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

    /**
     * @ORM\Column(type="string", length=200, name="firstName", nullable=true)
     */
    protected $firstName;

    /**
     * @ORM\Column(type="string", length=200, name="lastName", nullable=true)
     */
    protected $lastName;

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

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

    private $facebookAccessToken;


    public function getFirstName() {
        return $this->firstName;
    }

    public function getLastName() {
        return $this->lastName;
    }

    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;
        return $this;
    }

    public function setLastName($setLastName)
    {
        $this->lastName = $setLastName;
        return $this;
    }

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

        return $this;
    }

    /**
     * @param string $linkedinId
     * @return User
     */
    public function setLinkedinId($linkedinId)
    {
        $this->linkedinId = $linkedinId;

        return $this;
    }


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

    /**
     * @return string
     */
    public function getLinkedinId()
    {
        return $this->linkedinId;
    }

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

        return $this;
    }

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

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,但最终导致我的自定义防护类中的getUser函数无法返回有效用户。

因此,对于发现此问题的任何人,请检查您的getUser是否返回了一个有效的用户对象,该对象继承自相关的Symfony安全用户类或实现相关的UserInterface。

EG。 Java.Lang.Object

答案 1 :(得分:0)

我认为您必须扩展FOS \ UserBundle \ Entity \ User而不是FOS \ UserBundle \ Model \ User。