the symfony2 node must fosuser fos_user fos db_driver configured child php doctrine symfony fosuserbundle

php - symfony2 - symfony hash



Symfony2 $ user-> setPassword() actualiza la contraseña como texto sin formato (7)

Aquí una clase de muestra para crear un usuario administrador a través de los accesorios 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; } }

Estoy intentando rellenar previamente una base de datos con algunos objetos de usuario, pero cuando llamo $user->setPassword(''some-password''); y luego guarde el objeto del usuario, la cadena ''alguna contraseña'' se almacena directamente en la base de datos, en lugar de la contraseña hash + salada.

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

Y la salida de base de datos relevante:

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


Como está utilizando FOSUserBundle, puede usar UserManager para hacer esto. Usaría este código (suponiendo que tenga $this->container set de $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); }


Cuatro líneas de código y listo. Manejará todo por usted:

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


Esto funcionó para mí

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

Tenga en cuenta la diferencia al establecer la contraseña. Consultando la base de datos que encuentras

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


Llame setPlainPassword en su lugar.

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


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

setPlainPassword funciona para mí.


/** * 添加用户 * @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(); }

Arriba funcionó para mí, así que obtuve una conclusión:
1. debe usar setPlainPassword
2. debe setEnabled (verdadero)