2012-02-07 62 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)