";找不到用户名“;将HWIOAuthBundle与FOSUserBundle一起使用时出错


"Username could not be found" error when using HWIOAuthBundle with FOSUserBundle

在此处Stumped。使用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

安全性.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 }

路由.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
    }
}

我也遇到过类似的问题,但最终是因为我的自定义保护类中的getUser函数没有返回有效的用户。

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

例如。Symfony'Component'Security'Core'User'UserInterface

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