Symfony2 $ user-> setPassword () обновляет пароль как обычный текст

Я пытаюсь предварительно заполнить базу данных некоторыми объектами User, но когда я вызываю $user->setPassword('some-password'); а затем сохранить пользовательский объект, строка «some-password» хранится непосредственно в базе данных вместо хешированного + соленого пароля.

Мой класс DataFixture:

 // Acme/SecurityBundle/DataFixtures/ORM/LoadUserData.php <?php namespace Acme\SecurityBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Acme\SecurityBundle\Entity\User; class LoadUserData implements FixtureInterface { public function load(ObjectManager $manager) { $userAdmin = new User(); $userAdmin->setUsername('System'); $userAdmin->setEmail('system@example.com'); $userAdmin->setPassword('test'); $manager->persist($userAdmin); $manager->flush(); } } 

И соответствующий вывод базы данных:

 id username email salt password 1 System system@example.com 3f92m2tqa2kg8cookg84s4sow80880g test 

Поскольку вы используете FOSUserBundle, вы можете использовать UserManager для этого. Я бы использовал этот код (если у вас установлен этот $this->container ):

 public function load(ObjectManager $manager) { $userManager = $this->container->get('fos_user.user_manager'); $userAdmin = $userManager->createUser(); $userAdmin->setUsername('System'); $userAdmin->setEmail('system@example.com'); $userAdmin->setPlainPassword('test'); $userAdmin->setEnabled(true); $userManager->updateUser($userAdmin, true); } 

Вместо этого вызовите setPlainPassword.

 <?php namespace Acme\SecurityBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\FixtureInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Doctrine\Common\Persistence\ObjectManager; use Acme\SecurityBundle\Entity\User; class LoadUserData implements FixtureInterface, ContainerAwareInterface { private $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; } public function load(ObjectManager $manager) { $userAdmin = new User(); $userAdmin->setUsername('System'); $userAdmin->setEmail('system@example.com'); $userAdmin->setPlainPassword('test'); $userAdmin->setRoles(array('ROLE_SUPER_ADMIN')); $manager->persist($userAdmin); $manager->flush(); } } 

Четыре строки кода, и все готово. Он будет обрабатывать все для вас:

  $userManager = $this->container->get('fos_user.user_manager'); $user->setPlainPassword($password); $userManager->updatePassword($user); 

Это сработало для меня

  public function load(ObjectManager $manager){ $userAdmin = new User(); $userAdmin->setUsername('admin'); $userAdmin->setPlainPassword('admin'); $userAdmin->setEmail('admin@gmail.com'); $userAdmin->setEnabled(true); $manager->persist($userAdmin); $manager->flush(); } 

Обратите внимание на разницу при настройке пароля. Запрос базы данных, которую вы найдете

 id username username_canonical email email_canonical enabled salt password 2 admin admin admin@gmail.com admin@gmail.com 1 4gm0bx6jzocgksw0wws8kck04kg40o8 m2ZyJM2+oBIzt/NZdnOX4nFvjV/SWTU1qJqe6dWZ0UwLF5gB8N... 

 $userAdmin->setUsername('System'); $userAdmin->setEmail('system@example.com'); $userAdmin->setPlainPassword('test'); $userAdmin->setEnabled(true); 

setPlainPassword работает для меня.

 /** * 添加用户* @param $param * @return int */ public function doAdd($param) { $entity = new User(); $em = $this->getEntityManager(); $entity->setUsername($param['username']) ->setPlainPassword($param['password']) ->setEmail($param['email']) ->setEnabled(true) ->setRealName($param['realName']); $em->persist($entity); $em->flush(); return $entity->getId(); } 

Выше работал для меня, так что я получил некоторый вывод:
1. необходимо использовать setPlainPassword
2. должен setEnabled (true)

Здесь образец класса для создания пользователя-администратора через ORM Fixtures:

 <?php namespace Acme\SecurityBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\FixtureInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Acme\SecurityBundle\Entity\User; class LoadFOSAdminUser extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface { private $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; } public function load(ObjectManager $manager) { $userManager = $this->container->get('fos_user.user_manager'); $userAdmin = $userManager->createUser(); $userAdmin->setUsername('admin'); $userAdmin->setEmail('admin@example.com'); $userAdmin->setPlainPassword('admin'); $userAdmin->setEnabled(true); $userAdmin->setRoles(array('ROLE_ADMIN')); $userManager->updateUser($userAdmin, true); } public function getOrder() { return 1; } }