为什么Symfony在创建新的用户相关实体期间会删除密码?

时间:2016-02-18 15:24:56

标签: symfony

当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()方法?

修改

更重要的是,我希望理解 执行eraseCredentials()时。在什么条件下?

1 个答案:

答案 0 :(得分:2)

我终于找到了解释。此行为继续发生,因为我出于调试原因在单个字段中存储用户的密码。而且,我将它坚持在数据库中。

答案是eraseCredentials()方法的触发事件。因此,正如Symfony IRC频道上的 elnur 所述,当您使用编码密码保存明文密码等敏感信息时,这是有道理的。

  

<埃里乌尔>例如,用户对象被序列化为会话。   如果plainpassword被序列化并且恶意用户可以访问会话,他们将获得密码。

解决方案是:

  1. 仅使用纯文本密码且实施/重载UserInterface->eraseCredentials()(默认空白实施);
  2. 使用普通密码加密密码字段,实施eraseCredentials()方法以确保清除用户的敏感信息。