Symfony2 $user->setPassword() aktualisiert das Passwort als Klartext [DataFixtures + FOSUserBundle]
Lesezeit: 4 Minuten
Rodney Folz
Ich versuche, eine Datenbank vorab mit einigen Benutzerobjekten zu füllen, aber wenn ich anrufe $user->setPassword('some-password'); und dann das Benutzerobjekt speichern, wird die Zeichenfolge „some-password“ direkt in der Datenbank gespeichert, anstelle des gehashten + gesalzenen Passworts.
Meine DataFixture-Klasse:
// 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();
}
}
Und die relevante Datenbankausgabe:
id username email salt password
1 System [email protected] 3f92m2tqa2kg8cookg84s4sow80880g test
Anton Babenko
Da Sie FOSUserBundle verwenden, können Sie verwenden UserManager um dies zu tun. Ich würde diesen Code verwenden (vorausgesetzt, Sie haben $this->container einstellen):
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);
}
Danke für den UserManager-Tipp!
– Rodney Folz
10. Februar 2012 um 3:25 Uhr
Ich kann die „get“-Methode für „dieses“ Objekt nicht aufrufen, wenn ich versuche, die Fixtures in der DB zu erstellen: PHP Fatal error: Call to undefined method […]/UserFixtures::get()
– JavierIEH
4. September 2012 um 13:30 Uhr
@JavierIEH Sie müssen ContainerAwareInterface und ContainerInterface in Ihrer Fixture-Klasse implementieren. Siehe ‘Verwenden des Containers in den Vorrichtungen’ hier: raw.github.com/doctrine/DoctrineFixturesBundle/master/Resources/…. Anton Babenko, können Sie Ihre Antwort ändern, um dies bitte zu zeigen?
– nealio82
25. September 2012 um 10:28 Uhr
Ich glaube, das hat @RodneyFolz bereits in seiner Antwort beschrieben.
– Anton Babenko
25. September 2012 um 16:00 Uhr
Dies ist KEINE Antwort auf IHRE FRAGE – es ist nur eine Problemumgehung durch die Verwendung des FOSUserBundle. Die richtige Antwort steht unten aufgeschrieben von Rodney Folz…
– Thorinkor
14. Mai 2013 um 10:56 Uhr
Rodney Folz
Rufen Sie stattdessen setPlainPassword auf.
<?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();
}
}
Bitte achten Sie beim Aktualisieren darauf. Dann ist der Benutzermanager hilfreich. stackoverflow.com/a/9200996/1815881
– Atlan
23. Juli 2014 um 14:52 Uhr
kratos
Vier Zeilen Code und fertig. Es erledigt alles für Sie:
/**
* 添加用户
* @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();
}
Oben hat bei mir funktioniert, also habe ich eine Schlussfolgerung gezogen:
1. muss das setPlainPassword verwenden
2. muss aktiviert werden (true)
Hier eine Beispielklasse zum Erstellen eines Administratorbenutzers über 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('[email protected]');
$userAdmin->setPlainPassword('admin');
$userAdmin->setEnabled(true);
$userAdmin->setRoles(array('ROLE_ADMIN'));
$userManager->updateUser($userAdmin, true);
}
public function getOrder()
{
return 1;
}
}
12841000cookie-checkSymfony2 $user->setPassword() aktualisiert das Passwort als Klartext [DataFixtures + FOSUserBundle]yes