我使用Symfony 3.3.14和最新更新的FOS用户包。我通过/ register创建了一个用户,并在重定向后登录。如果我退出并尝试再次登录,则会收到消息“无效凭据”。
如果我在PHP Storm中通过终端手动生成用户并在那里设置密码,则登录正常。
所以我认为问题是由寄存器造成的,我特别想在那里设置密码。
我的security.yml看起来像这样:
# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
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_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: AppBundle\Entity\User
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
我的用户实体看起来像这样:
/**
* Created by PhpStorm.
* User: Whykiki2013
* Date: 05.11.2017
* Time: 00:48
*/
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="user")
* @UniqueEntity(fields={"email"}, message="Sie sind bereits registriert")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $gender;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $name;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $surname;
/**
* @ORM\Column(type="string" , nullable=true)
*/
private $street;
/**
* @ORM\Column(type="string" , nullable=true)
*/
private $zipcode;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $city;
/**
* @ORM\Column(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
我认为使用编码器设置密码可能存在问题。但我无法弄清楚如何解决它。
嗯,这很奇怪。如果您从文档中执行了所有步骤,似乎您已正确配置它,因此问题可能是您确实传递了无效凭据。
你的composer.json中有fos版本~2.0吗?在master分支中,最近有一些变化可能会在symfony 3.3中出现问题。
尝试还检查数据库中启用的字段。
顺便说一句。您不需要实现eraseCredentials和getSalt方法。它们已经在BaseUser类中实现(名称来自您的代码)。
我不知道改变了什么.....现在它通过寄存器与两个新生成的用户一起工作。
就像之前说的那样我删除了以下几行:
public function getUsername()
{
return $this->email;
}
public function getSalt()
{
// TODO: Implement getSalt() method.
}
public function eraseCredentials()
{
$this->plainPassword = null;
}
它们来自我之前构建我的User类的教程。
有趣的是:即使我将代码行粘贴回我的用户实体 - 它正在工作。
我真的不满意:-)它有效,但我不知道为什么......