2012-02-07 40 views
40

我试图用一些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('[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提示! – 2012-02-10 03:25:16

+2

当我尝试在DB上创建灯具时,我无法调用“this”对象上的“get”方法: PHP致命错误:调用未定义的方法[...]/UserFixtures :: get() – JavierIEH 2012-09-04 13:30:57

+2

@JavierIEH你需要在你的fixtures类中实现ContainerAwareInterface和ContainerInterface。请参阅'在灯具中使用容器':https://raw.github.com/doctrine/DoctrineFixturesBundle/master/Resources/doc/index.rst。 Anton Babenko,你可以修改你的答案来表明这一点吗? – nealio82 2012-09-25 10:28:57

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

完美..... :) – 2013-12-04 07:20:15

+2

更新时请注意。然后用户管理器是有用的。 http://stackoverflow.com/a/9200996/1815881 – Athlan 2014-07-23 14:52:45

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 2013-03-27 05:43:21

+0

更新时请小心。然后用户管理器是有用的。 HTTP://计算器。com/a/9200996/1815881 – Athlan 2014-07-23 14:53:46

7

四行代码,你就完成了。它会处理你的一切:

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

我在重置密码时更新密码字段时出现问题,您的解决方案只是修复了它,谢谢 – Alireza 2016-07-25 07:44:28

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。必须setEnabled(true)