我使用Symfony 3.3.14和最后更新的FOS用户捆绑包。我通过/寄存器创建了一个用户,重定向后,我登录了。如果我注销并尝试再次登录,我会收到消息"无效的凭据"。
如果我通过php Storm中的终端手动生成用户并在此处设置密码,则登录工作正常。
所以我认为问题是由寄存器引起的,我认为特别是将密码设置在此处。
我的security.ym看起来像这样:
# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
encoders:
FOSUserBundleModelUserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
# if you are using Symfony < 2.8, use the following config instead:
# csrf_provider: form.csrf_provider
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
我的config.yml:
fos_user:
db_driver: orm # other valid values are 'mongodb' and 'couchdb'
firewall_name: main
user_class: AppBundleEntityUser
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
和我的用户实体看起来像这样:
/**
* Created by PhpStorm.
* User: Whykiki2013
* Date: 05.11.2017
* Time: 00:48
*/
namespace AppBundleEntity;
use FOSUserBundleModelUser as BaseUser;
use DoctrineORMMapping as ORM;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @ORMEntity
* @ORMTable(name="user")
* @UniqueEntity(fields={"email"}, message="Sie sind bereits registriert")
*/
class User extends BaseUser
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
protected $id;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $gender;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $name;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $surname;
/**
* @ORMColumn(type="string" , nullable=true)
*/
private $street;
/**
* @ORMColumn(type="string" , nullable=true)
*/
private $zipcode;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $city;
/**
* @ORMColumn(type="string", nullable=true)
*/
private $phone;
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getGender()
{
return $this->gender;
}
/**
* @param mixed $gender
*/
public function setGender($gender)
{
$this->gender = $gender;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* @return mixed
*/
public function getSurname()
{
return $this->surname;
}
/**
* @param mixed $surname
*/
public function setSurname($surname)
{
$this->surname = $surname;
}
/**
* @return mixed
*/
public function getStreet()
{
return $this->street;
}
/**
* @param mixed $street
*/
public function setStreet($street)
{
$this->street = $street;
}
/**
* @return mixed
*/
public function getZipcode()
{
return $this->zipcode;
}
/**
* @param mixed $zipcode
*/
public function setZipcode($zipcode)
{
$this->zipcode = $zipcode;
}
/**
* @return mixed
*/
public function getCity()
{
return $this->city;
}
/**
* @param mixed $city
*/
public function setCity($city)
{
$this->city = $city;
}
/**
* @return mixed
*/
public function getPhone()
{
return $this->phone;
}
/**
* @param mixed $phone
*/
public function setPhone($phone)
{
$this->phone = $phone;
}
public function getUsername()
{
return $this->email;
}
public function getSalt()
{
// TODO: Implement getSalt() method.
}
public function eraseCredentials()
{
$this->plainPassword = null;
}
}
在基本我遵循设置FOS UserBundle的步骤:
http://symfony.com/doc/master/bundles/fosuserbundle/index.html版本2
我认为使用编码器设置密码可能存在问题。但是我不知道如何修复它。
mmm这很奇怪。如果您从文档中执行了所有步骤,看来您已经正确配置了它,因此问题可能是您确实通过了无效的凭据。
您的Composer.json中是否有FOS版本〜2.0?在主人分支中,最近有一些变化可以在Symfony 3.3中引起问题。
尝试在数据库中检查启用字段。
顺便说一句。您不需要实现erasecredentials和getalt的方法。它们已经在baseuser类中为您实施(名称来自您的代码)。
我不知道发生了什么变化.....现在它通过寄存器与两个新生成的用户一起使用。
在我删除以下行之前说的那样:
public function getUsername()
{
return $this->email;
}
public function getSalt()
{
// TODO: Implement getSalt() method.
}
public function eraseCredentials()
{
$this->plainPassword = null;
}
他们来自一个教程,我以前构建了用户课程。
有趣的是:即使我将代码粘贴回我的用户实现 - 它正在工作。
我不太满意:-)它有效,但我不知道为什么...