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

为什么Symfony会在创建新的用户相关实体时删除密码?,symfony,Symfony,当Symfony进行插入(用于创建新实体)时,发出此请求的用户的密码将被清除 我有一个实体,它将用户ID作为外键,映射为条令的manytone关系 我观察到,在幕后,在每个persist()请求中,都会不断调用该方法: 公共删除凭据() 从用户中删除敏感数据 如果在任何给定点,敏感信息(如明文密码)存储在此对象上,这一点非常重要 此方法定义为Symfony\Component\Security\Core\User\UserInterface的一部分。现在,有人建议我不要实现这种方法(留空),但我

当Symfony进行插入(用于创建新实体)时,发出此请求的用户的密码将被清除

我有一个实体,它将用户ID作为外键,映射为条令的
manytone
关系

我观察到,在幕后,在每个
persist()
请求中,都会不断调用该方法:

公共删除凭据()

从用户中删除敏感数据

如果在任何给定点,敏感信息(如明文密码)存储在此对象上,这一点非常重要

此方法定义为
Symfony\Component\Security\Core\User\UserInterface
的一部分。现在,有人建议我不要实现这种方法(留空),但我认为这不是避免这种行为的最佳方法

用户实体

控制器新操作

开发日志

我正在使用Symfony 2.8.2

为什么会这样?为什么它一直调用eraseCredentials()方法? 编辑


更重要的是,我想了解执行
eraseCredentials()
时的。在什么情况下?

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

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

例如,用户对象被序列化到会话中。 如果明文密码被序列化,恶意用户可以访问会话,他们将获得密码

解决办法是:

  • 仅使用纯文本密码,而不使用实现/重载
    UserInterface->eraseCredentials()
    (默认为空实现)
  • 使用普通密码和加密密码字段,执行
    eraseCredentials()
    方法以确保清除用户的敏感信息 正如elnur在#symfony IRC频道上指出的,原因可能是我对加密密码和普通密码都使用了一个字段。老实说,目前我只有一个简单的密码。
    public function eraseCredentials() {
      $this->password = false;
    }
    
        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();
    
    [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] []