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)