身份验证后,当我输入正确的用户名/密码时,我会重定向到一个新页面(驱动程序空间/仪表板),并出现以下错误:
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.
符号栏显示:"您未通过身份验证"。。
这里是我的安全.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);
}
我希望这个解决方案能帮助
添加这个答案是因为它可能会对某人有所帮助。删除用户并将其重定向到登录页面后,也可能出现此错误。在这种情况下,在重定向之前,应该使其会话无效:
$request->getSession()->invalidate();
$this->tokenStorage->setToken(); // TokenStorageInterface
return $this->redirectToRoute('login');
添加这个答案是因为它可能会对某人有所帮助。删除用户并将其重定向到登录页面后,也可能出现此错误。在这种情况下,在重定向之前,应该使其会话无效(我已经使用SF6):
$request->getSession()->invalidate();
$this->container->get('security.token_storage')->setToken(null);
注意:科尔的回答对我帮助很大!
这适用于使用Symfony 4 REST API并出现此错误的用户。这是因为stateless
标志在security.yml
中为假,并且它需要为真。
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
希望这能帮助到别人,干杯