4
votes

Symfony 4 EasyAdmin comment crypter les mots de passe?

J'utilise EasyAdmin pour ajouter / modifier des utilisateurs et je voulais demander s'il y a une possibilité de crypter vos mots de passe? Le cryptage du mot de passe fonctionnait auparavant lorsque j'utilisais le formulaire d'enregistrement de Symfony 4 make: mais je ne peux pas l'utiliser maintenant, je dois utiliser EasyAdmin.

easy_admin.yaml

easy_admin:
  entities:
    User:
     class: App\Entity\User
     password_encoding: { algorithm: 'bcrypt', cost: 12 }

(Réel) Je vais à la page EasyAdmin (/ admin), cliquez sur Utilisateur, Ajouter un utilisateur, remplissez l'email (test@gmail.com) et le mot de passe (test), cliquez sur Enregistrer les modifications.

Maintenant l'utilisateur est stocké dans la base de données mais avec un mot de passe en clair. entrez la description de l'image ici

(attendu) Tout ce qui précède mais le mot de passe est crypté.


10 commentaires

Cela n'a rien à voir avec Easy Admin. Vous devez configurer vous-même la sécurité dans packages / security.yaml


J'ai écrit ceci dans security.yaml security: encoders: App \ Entity \ User: algorithme: argon2i


Pourriez-vous développer votre question? Voulez-vous dire que lorsque vous créez / modifiez des utilisateurs via EasyAdmin, il ne crypte pas les mots de passe?


Oui c'est ce que je veux dire


Veuillez ajouter plus de détails. Utilisez-vous un bundle pour la gestion des utilisateurs, par exemple FOSUserBundle? À quoi ressemble votre configuration pour EasyAdmin?


Il y a une courte section dans la documentation sur la gestion des propriétés avec EasyAdmin. Avez-vous déjà essayé cela? symfony.com/doc/ current / bundles / EasyAdminBundle / tutorials /…


Je l'ai vu mais je ne comprends pas vraiment comment l'utiliser. Je dois donc mettre password_encoding: ... dans easy_admin.yaml mais que faire alors?


Pour autant que je sache, cela devrait résoudre votre problème. Le mot de passe doit être encodé lors de son enregistrement. Allons-y étape par étape. Veuillez ajouter votre easy_admin.yaml à la question. Ensuite, expliquez-nous le processus, par ex. allez à la liste des utilisateurs, cliquez sur créer un utilisateur, insérez les données X, puis terminez avec le résultat attendu (l'utilisateur est créé et le mot de passe chiffré est stocké dans la base de données) par rapport au résultat réel (par exemple, le mot de passe dans la base de données a été enregistré en texte brut). Si vous pouvez fournir des modifications de code que vous avez apportées, cela vous aiderait également. À partir de là, nous pouvons suggérer des changements et vous pouvez dire comment ils affectent le résultat réel.


Je l'ai ajouté à la description


Vous trouverez peut-être ici la réponse: github.com/EasyCorp/EasyAdminBundle/issues/1261 . Vous devez remplacer UserController et ajouter manuellement le codage / décodage du mot de passe.


3 Réponses :


3
votes

Étendez le contrôleur EasyAdmin et gérez l'entité utilisateur. Quelque chose comme ceci:

namespace AppBundle\Controller\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AdminController as BaseAdminController;
use AppBundle\Entity\User;

class AdminController extends BaseAdminController
{
    protected function prePersistUserEntity(User $user)
    {
        $encodedPassword = $this->encodePassword($user, $user->getPassword());
        $user->setPassword($encodedPassword);
    }

    protected function preUpdateUserEntity(User $user)
    {
        if (!$user->getPlainPassword()) {
            return;
        }
        $encodedPassword = $this->encodePassword($user, $user->getPlainPassword());
        $user->setPassword($encodedPassword);
    }

    private function encodePassword($user, $password)
    {
        $passwordEncoderFactory = $this->get('security.encoder_factory');
        $encoder = $passwordEncoderFactory->getEncoder($user);
        return $encoder->encodePassword($password, $user->getSalt());
    }

}


0 commentaires

4
votes

Nouvelle version compatible avec Symfony 5:

<?php

namespace App\Controller;

use App\Entity\User;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;

class AdminController extends EasyAdminController
{
    protected function persistUserEntity($user)
    {
        $encodedPassword = $this->encodePassword($user, $user->getPlainPassword());
        $user->setPassword($encodedPassword);

        parent::persistEntity($user);
    }

    protected function updateUserEntity($user)
    {
        $encodedPassword = $this->encodePassword($user, $user->getPlainPassword());
        $user->setPassword($encodedPassword);

        parent::updateEntity($user);
    }

    private function encodePassword($user, $password)
    {
        $passwordEncoderFactory = new EncoderFactory([
            User::class => new MessageDigestPasswordEncoder('sha512', true, 5000)
        ]);

        $encoder = $passwordEncoderFactory->getEncoder($user);

        return $encoder->encodePassword($password, $user->getSalt());
    }
}


0 commentaires

4
votes

Code de mon projet de travail basé sur Symfony 5 et PHP 7.4
  1. Étendre EasyAdminController :
easy_admin:
    entities:
        User:
            class: App\Entity\User
            label: label.user
            new:
                title:  field.user.add_new
                fields:
                    # some fields like username here
                    - { property: username, label: field.user.username }
                    - { property: fullname, label: field.user.fullname, type: 'text' }
                    # plain password 
                    - { property: plainPassword, label: field.user.password, type: 'password' }
  1. Enregistrez votre contrôleur dans EasyAdminBundle, modifiez config / routes / easy_admin.yaml :
/**
* @Assert\NotBlank()
* @Assert\Length(min=5, max=128)
*/
private ?string $plainPassword = null;

public function getPlainPassword(): ?string
{
    return $this->plainPassword;
}

public function setPlainPassword(string $password): void
{
    $this->plainPassword = $password;
}
  1. Ajoutez la propriété plainPassword "virtual" à votre entité User :
easy_admin_bundle:
    resource: 'App\Controller\AdminController'
    prefix: /admin
    type: annotation
  1. Mettre à jour easy_admin.yaml
<?php

declare(strict_types=1);

namespace App\Controller;

use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

/**
 * Class AdminController.
 *
 * @author Dmitriy Atamaniuc <d.atamaniuc@gmail.com>
 */
final class AdminController extends EasyAdminController
{
    private UserPasswordEncoderInterface $encoder;

    private function setUserPlainPassword(User $user): void
    {
        if ($user->getPlainPassword()) {
            $user->setPassword($this->encoder->encodePassword($user, $user->getPlainPassword()));
        }
    }

    /**
     * @required
     */
    public function setEncoder(UserPasswordEncoderInterface $encoder): void
    {
        $this->encoder = $encoder;
    }

    public function persistUserEntity(User $user): void
    {
        $this->setUserPlainPassword($user);

        $this->persistEntity($user);
    }

    public function updateUserEntity(User $user): void
    {
        $this->setUserPlainPassword($user);

        $this->updateEntity($user);
    }
}


0 commentaires