Symfony2 $user->setPassword() updates password as plain text [DataFixtures + FOSUserBundle]

前端 未结 7 1751
庸人自扰
庸人自扰 2020-12-23 13:44

I\'m trying to pre-populate a database with some User objects, but when I call $user->setPassword(\'some-password\'); and then save the user object, the stri

相关标签:
7条回答
  • 2020-12-23 14:13

    This worked for me

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

    Note the difference when setting the password. Querying the database you find

    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...
    
    0 讨论(0)
  • 2020-12-23 14:15

    Here a sample class to create an admin user via 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;
        }
    }
    
    0 讨论(0)
  • 2020-12-23 14:16
    /**
     * 添加用户
     * @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();
    }
    

    Above worked for me, so I got some conclusion:
    1. must use the setPlainPassword
    2. must setEnabled(true)

    0 讨论(0)
  • 2020-12-23 14:23

    Since you are using FOSUserBundle, you can use UserManager to do this. I would use this code (assuming you have $this->container set):

    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);
    }
    
    0 讨论(0)
  • 2020-12-23 14:26

    Four lines of code and you are done. It will handle everything for you:

            $userManager = $this->container->get('fos_user.user_manager');
            $user->setPlainPassword($password);
            $userManager->updatePassword($user);  
    
    0 讨论(0)
  • 2020-12-23 14:30

    Call setPlainPassword instead.

    <?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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题