Php Symfony身份验证(无法从EntityUserProvider刷新用户)

Php Symfony身份验证(无法从EntityUserProvider刷新用户),php,symfony,authentication,doctrine-orm,fosuserbundle,Php,Symfony,Authentication,Doctrine Orm,Fosuserbundle,身份验证后,当我输入正确的用户名/密码时,我将被重定向到一个新页面(driverspace/dashboard),并出现以下错误: You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine. 符号栏显示:“您未通

身份验证后,当我输入正确的用户名/密码时,我将被重定向到一个新页面(driverspace/dashboard),并出现以下错误:

You cannot refresh a user from the EntityUserProvider that does not contain an identifier.
 The user object has to be serialized with its own identifier mapped by Doctrine.
符号栏显示:“您未通过身份验证”

这里是我的security.xml 防火墙:

    driver_firewall:
        pattern: ^/driver
        form_login:
            provider: user_db
            login_path: /driver/login
            check_path: /driver/login_check
            remember_me: true
            always_use_default_target_path: false
            default_target_path:            /driverspace/dashboard
            target_path_parameter:          _target_path
            use_referer:                    false
        logout:
            path: /driver/logout
            target: /
        remember_me:
            key: MiPassphrase
            lifetime: 1800
            path: /.*
            domain: ~
        security: true
        anonymous: true
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
        logout:       true
        anonymous:    true
PS:我有两种类型的用户,因此我与fos一起管理其中一种,并使用基本身份验证来管理另一种, 编辑:驱动程序实体

class Driver extends BaseUser implements \FOS\UserBundle\Model\UserInterface
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_driver", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idDriver;

    /**
     * @var string
     *
     * @ORM\Column(name="fname_drive", type="string", length=30, nullable=false)
     */
    private $fnameDrive;

    /**
     * @var string
     *
     * @ORM\Column(name="lname_driver", type="string", length=30, nullable=false)
     */
    private $lnameDriver;

    /**
     * @var string
     *
     * @ORM\Column(name="phone_driver", type="string", length=15, nullable=false)
     */
    private $phoneDriver;

    /**
     * @var float
     *
     * @ORM\Column(name="lat_driver", type="float", precision=10, scale=0, nullable=true)
     */
    private $latDriver;

    /**
     * @var float
     *
     * @ORM\Column(name="lon_driver", type="float", precision=10, scale=0, nullable=true)
     */
    private $lonDriver;

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

    /**
     * @var \Company
     *
     * @ORM\ManyToOne(targetEntity="Company")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="company_id", referencedColumnName="id_company")
     * })
     */
    private $company;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Car", inversedBy="idDriver")
     * @ORM\JoinTable(name="driver_car",
     *   joinColumns={
     *     @ORM\JoinColumn(name="id_driver", referencedColumnName="id_driver")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="id_car", referencedColumnName="id_car")
     *   }
     * )
     */
    private $idCar;

我通过以下方式解决了这个问题:

1-将idDriver更改为id,因为驱动程序类扩展了BaseUSer

2-加入:

 public function serialize() {
    return serialize($this->id);
    }

    public function unserialize($data) {
    $this->id = unserialize($data);
    }

我希望这个解决方案能帮助一些人

这是为那些使用Symfony 4 REST API并出现此错误的人准备的。这是因为
security.yml
中的
无状态
标志为false,并且它必须为true

login:
    pattern:  ^/login
    stateless: true
    anonymous: true
    json_login:
        check_path: /login_check
        success_handler: app.jwt_token_authenticator.success
        failure_handler: app.jwt_token_authenticator.failure
希望这对别人有帮助,
干杯。

添加此答案,因为它可能会帮助某人。删除用户并将其重定向到登录页面后,也可能出现此错误。在这种情况下,在重定向之前,应使其会话无效:

        $request->getSession()->invalidate();
        $this->tokenStorage->setToken(); // TokenStorageInterface

        return $this->redirectToRoute('login');

我们需要查看相关的用户实体。@Toms:检查调试工具栏中的编辑请检查,第一个与用户相关的查询是什么?请把它也贴出来。