Symfony2: Аутентификация с использованием сущности Doctrine2 — пароль устанавливается в пустое значение после сохранения сущности

#php #authentication #entity #doctrine-orm #symfony

#php #аутентификация #сущность #doctrine-orm #симфония

Вопрос:

Здесь я зашел в тупик. Когда я сохраняю какой-либо объект в своем контроллере, пароль и соль пользователя, который в данный момент вошел в систему, стираются в базе данных.

Это важная часть моей конфигурации безопасности:

 security:
    encoders:
        ISELoginBundleEntityUser:
            algorithm: sha1
            iterations: 1
            encode_as_base64: false
    providers:
        main:
            entity:
                class: ISELoginBundleEntityUser
                property: username
  

Это метод eraseCredentials моего пользовательского класса. Я подозреваю, что в какой-то момент вызывается этот метод, а затем пользовательский объект сохраняется в базе данных с этими изменениями. Но я понятия не имею, где это может быть:

 class User implements UserInterface {
    // ...
    public function eraseCredentials() {
        $this->password = null;
        $this->salt = null;
    }
    // ...
}
  

И это пример того, как я сохраняю сущность в одном из моих контроллеров, в данном случае это ProductController. Просто напоминаю: я никоим образом не манипулирую объектом User в своем коде:

 public function createAction() {
    // ...
    if ($form->isValid()) {
        $em = $this->get('doctrine')->getEntityManager();
        $em->persist($product);
        $em->flush();
        return $this->redirect($this->generateUrl('product_create', array('created' => true)));
    }
    // ...
}
  

Я бы не ожидал, что какой-либо из этих кодов удалит пароль пользователя или соль в базе данных, но именно это происходит. Кто-нибудь может помочь мне доработать мой код до отправки?

Комментарии:

1. Что такое $product ? И, может быть, eraseCredentials звонит, проверьте это

2. $product — это экземпляр Product, объекта, который я сохраняю. Как я уже сказал, это происходит всякий раз, когда я сохраняю любую сущность в моем контроллере.

Ответ №1:

В Symfony есть разница между открытым текстом и хэшированными учетными данными. В «eraseCredentials» предполагается удалить всю информацию открытого текста, а не хэшированные учетные данные, которые сохраняются в базе данных.

Комментарии:

1. а, понятно. Значит, я могу просто оставить eraseCredentials пустым до тех пор, пока в пользовательском объекте есть только хэшированные учетные данные?