2012-02-07 4 views
40

Я пытаюсь предварительно заполнить базу данных некоторыми объектами пользователя, но когда я вызываю $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('[email protected]'); 
     $userAdmin->setPassword('test'); 

     $manager->persist($userAdmin); 
     $manager->flush(); 
    } 
} 

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

id username email    salt        password 
1 System  [email protected] 3f92m2tqa2kg8cookg84s4sow80880g  test 

ответ

81

Поскольку вы используете 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('[email protected]'); 
    $userAdmin->setPlainPassword('test'); 
    $userAdmin->setEnabled(true); 

    $userManager->updateUser($userAdmin, true); 
} 
+5

Спасибо за подсказку UserManager! –

+2

Я не могу вызвать метод «get» на «этом» объекте, когда я пытаюсь построить приборы на БД: PHP Неустранимая ошибка: вызов неопределенного метода [...]/UserFixtures :: get() – JavierIEH

+2

@JavierIEH Вам необходимо реализовать ContainerAwareInterface и ContainerInterface в вашем классе светильников. См. «Использование контейнера в светильниках» здесь: https://raw.github.com/doctrine/DoctrineFixturesBundle/master/Resources/doc/index.rst. Антон Бабенко, можете ли вы изменить свой ответ, чтобы показать это, пожалуйста? – nealio82

30

Вызов 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('[email protected]');    
     $userAdmin->setPlainPassword('test'); 
     $userAdmin->setRoles(array('ROLE_SUPER_ADMIN')); 

     $manager->persist($userAdmin); 
     $manager->flush(); 
    } 
} 
+0

perfect ..... :) –

+2

Пожалуйста, следите за обновлениями. Тогда пользовательский менеджер полезен. http://stackoverflow.com/a/9200996/1815881 – Athlan

6

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

public function load(ObjectManager $manager){ 
    $userAdmin = new User(); 
    $userAdmin->setUsername('admin'); 
    $userAdmin->setPlainPassword('admin'); 
    $userAdmin->setEmail('[email protected]'); 
    $userAdmin->setEnabled(true); 

    $manager->persist($userAdmin); 
    $manager->flush(); 
    } 

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

id username username_canonical email    email_canonical enabled salt       password  
    2 admin  admin    [email protected] [email protected] 1  4gm0bx6jzocgksw0wws8kck04kg40o8 m2ZyJM2+oBIzt/NZdnOX4nFvjV/SWTU1qJqe6dWZ0UwLF5gB8N... 
+0

работает отлично .. – Vamsi

+0

Пожалуйста, следите за обновлениями. Тогда пользовательский менеджер полезен. Http: // StackOverflow.com/a/9200996/1815881 – Athlan

7

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

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

У меня возникла проблема с обновлением поля пароля во время сброса пароля, и ваше решение просто исправило его, спасибо – Alireza

1

$userAdmin->setUsername('System'); 
$userAdmin->setEmail('[email protected]'); 
$userAdmin->setPlainPassword('test'); 
$userAdmin->setEnabled(true); 

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

0

Здесь класс образец для создания пользователя с правами администратора с помощью ORM Светильники:

<?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('[email protected]'); 
     $userAdmin->setPlainPassword('admin'); 
     $userAdmin->setEnabled(true); 
     $userAdmin->setRoles(array('ROLE_ADMIN')); 

     $userManager->updateUser($userAdmin, true); 
    } 

    public function getOrder() 
    { 
     return 1; 
    } 
} 
1
/** 
* 添加用户 
* @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. must setEnabled (true)