Я пытаюсь предварительно заполнить базу данных некоторыми объектами 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; } }