2012-02-07 32 views
40

Tôi đang cố gắng điền trước một cơ sở dữ liệu với một số đối tượng User, nhưng khi tôi gọi $user->setPassword('some-password'); và sau đó lưu đối tượng người dùng, chuỗi 'some-password' được lưu trữ trực tiếp trong cơ sở dữ liệu, thay vì mật khẩu băm + muối.

My DataFixture lớp:

// 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(); 
    } 
} 

Và đầu ra cơ sở dữ liệu liên quan:

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

Trả lời

81

Vì bạn đang sử dụng FOSUserBundle, bạn có thể sử dụng UserManager để thực hiện việc này. Tôi sẽ sử dụng mã này (giả sử bạn có $this->container bộ):

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

Cảm ơn mẹo UserManager! –

+2

Tôi không thể gọi phương thức "get" trên đối tượng "this" khi tôi cố gắng xây dựng các đồ đạc lên DB: Lỗi nghiêm trọng PHP: Gọi đến phương thức không xác định [...]/UserFixtures :: get() – JavierIEH

+2

@JavierIEH Bạn cần triển khai ContainerAwareInterface và ContainerInterface trong lớp đồ đạc của bạn. Xem 'sử dụng vùng chứa trong các đồ đạc' tại đây: https://raw.github.com/doctrine/DoctrineFixturesBundle/master/Resources/doc/index.rst. Anton Babenko, bạn có thể sửa đổi câu trả lời của mình để hiển thị điều này không? – nealio82

30

Gọi setPlainPassword để thay thế.

<?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

hoàn hảo ..... :) –

+2

Vui lòng xem trong khi cập nhật. Sau đó, người quản lý người dùng là hữu ích. http://stackoverflow.com/a/9200996/1815881 – Athlan

6

này làm việc cho tôi

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(); 
    } 

Lưu ý sự khác biệt khi thiết lập mật khẩu. Truy vấn cơ sở dữ liệu bạn tìm thấy

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

hoạt động hoàn hảo .. – Vamsi

+0

Vui lòng xem trong khi cập nhật. Sau đó, người quản lý người dùng là hữu ích. http: // stackoverflow.com/a/9200996/1815881 – Athlan

7

Bốn dòng mã và bạn đã hoàn tất. Nó sẽ xử lý tất cả mọi thứ cho bạn:

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

Tôi gặp sự cố khi cập nhật trường mật khẩu trong khi đặt lại mật khẩu và giải pháp của bạn đã khắc phục sự cố, cảm ơn – Alireza

1

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

setPlainPassword làm việc cho tôi.

0

Dưới đây là một lớp học mẫu để tạo một tài khoản admin qua Lịch thi đấu 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(); 
} 

Trên từng làm việc cho tôi, vì vậy tôi có một số kết luận:
1. phải sử dụng setPlainPassword
2. must setEnabled (true)

Các vấn đề liên quan