Symfony2 $user->setPassword() aktualisiert das Passwort als Klartext [DataFixtures + FOSUserBundle]

Lesezeit: 4 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
kratos

Vier Zeilen Code und fertig. Es erledigt alles für Sie:

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

  • Ich hatte das Problem mit der Aktualisierung des Passwortfelds während des Zurücksetzens des Passworts und Ihre Lösung hat es gerade behoben, danke

    – Alireza

    25. Juli 2016 um 7:44 Uhr

Das hat bei mir funktioniert

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

Beachten Sie den Unterschied beim Festlegen des Passworts. Abfragen der Datenbank, die Sie finden

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

Benutzer-Avatar
Ali Hassan

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

setPlainPassword funktioniert bei mir.

Benutzer-Avatar
mingke tu

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

1284100cookie-checkSymfony2 $user->setPassword() aktualisiert das Passwort als Klartext [DataFixtures + FOSUserBundle]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy