当Symfony进行插入(用于创建新实体)时,将清除发出此请求的用户的密码。
我有一个将 User ID作为外键的实体,它被映射为Doctrine的ManyToOne
关系。
我在幕后发现,在每个persist()
请求中,方法eraseCredentials()会不断被召回:
公开 eraseCredentials ()
从用户中删除敏感数据。
如果在任何给定点上,明文密码等敏感信息都存储在此对象上,这一点非常重要。
此方法被定义为Symfony\Component\Security\Core\User\UserInterface
的一部分。现在,有人建议我不要实现这种方法(留空),但我认为这不是避免这种行为的最佳方法。
用户实体
public function eraseCredentials() {
$this->password = false;
}
控制器newAction
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
// Add default info for ticketreply creation
$dt = new \DateTime();
$user = $this->get('security.context')->getToken()->getUser();
$ticket = $em->getRepository('SupportBundle:Ticket')->find($tid);
$ticketReply
->setTicket($ticket)
->setAuthor($user)
->setCreationDate($dt)
;
$em->persist($ticketReply);
$em->flush();
dev.log
[2016-02-18 15:16:58] security.DEBUG: Read existing security token from the session. {"key":"_security_default"} []
[2016-02-18 15:16:58] security.DEBUG: User was reloaded from a user provider. {"username":"MYUSER","provider":"Symfony\\Component\\Security\\Core\\User\\ChainUserProvider"} []
[2016-02-18 15:16:58] doctrine.DEBUG: UPDATE account SET password = ? WHERE id = ? [false,1] []
我正在使用 Symfony 2.8.2
修改
更重要的是,我希望理解 执行eraseCredentials()
时。在什么条件下?
答案 0 :(得分:2)
我终于找到了解释。此行为继续发生,因为我出于调试原因在单个字段中存储用户的密码。而且,我将它坚持在数据库中。
答案是eraseCredentials()
方法的触发事件。因此,正如Symfony IRC频道上的 elnur 所述,当您使用编码密码保存明文密码等等敏感信息时,这是有道理的。
<埃里乌尔>例如,用户对象被序列化为会话。 如果plainpassword被序列化并且恶意用户可以访问会话,他们将获得密码。
解决方案是:
UserInterface->eraseCredentials()
(默认空白实施); eraseCredentials()
方法以确保清除用户的敏感信息。