Bonjour,

Je rencontre un petit problème et je viens solliciter de l'aide. Je ne sais si le sujet aurait déjà été évoquer, mais je développe un site avec Symfony 5 et comme backend Easyadmin 3. Depuis un moment je peine à encoder le mot de passe qui s'enrégistre en clair dans la base de données et il n'y a pas de password field dans la documentation non plus. Quelqu'un aurait une solution à me proposer ?

PS: le but de cet encodage est de pouvoir créer les administrateurs dans le backoffice et de leur assigner des rôles particuliers; tout ceci pour éviter que le client reste dépendant de nous. Sinon j'ai déjà utilisé l'option fixtures. Mais je voudrais beaucoup que mes clients puissent eux-même créer les admins.

Merci à l'avance

3 réponses


Thermo7
Réponse acceptée

Salut,

Ceci devrait pouvoir t'aider https://stackoverflow.com/questions/54744836/symfony-4-easyadmin-how-to-encrypt-passwords

Au final il faut encoder le password avant de le save.

bidule
Réponse acceptée

salut,

essai avec ça ;)

Je passe par les eventSubscriber afin de gérer les mot de passe lors des ajouts et des mise à jour de mot de passe.

Il faut juste ajouter un dossier "EventSubscriber" puis ajouter la class suivante : "EasyAdminSubscriber.php" et le code qui va avec

  <?php

  namespace App\EventSubscriber;

  use App\Entity\User;
  use Doctrine\ORM\EntityManagerInterface;
  use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
  use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
  use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

  class EasyAdminSubscriber implements EventSubscriberInterface
  {

      private $entityManager;
      private $passwordEncoder;

      public function __construct(EntityManagerInterface $entityManager, UserPasswordEncoderInterface $passwordEncoder)
      {
          $this->entityManager = $entityManager;
          $this->passwordEncoder = $passwordEncoder;
      }

      public static function getSubscribedEvents()
      {
          return [
              BeforeEntityPersistedEvent::class => ['addUser'],
              BeforeEntityUpdatedEvent::class => ['updateUser'], //surtout utile lors d'un reset de mot passe plutôt qu'un réel update, car l'update va de nouveau encrypter le mot de passe DEJA encrypté ...
          ];
      }

      public function updateUser(BeforeEntityUpdatedEvent $event)
      {
          $entity = $event->getEntityInstance();

          if (!($entity instanceof User)) {
              return;
          }
          $this->setPassword($entity);
      }

      public function addUser(BeforeEntityPersistedEvent $event)
      {
          $entity = $event->getEntityInstance();

          if (!($entity instanceof User)) {
              return;
          }
          $this->setPassword($entity);
      }

      /**
       * @param User $entity
       */
      public function setPassword(User $entity): void
      {
          $pass = $entity->getPassword();

          $entity->setPassword(
              $this->passwordEncoder->encodePassword(
                  $entity,
                  $pass
              )
          );
          $this->entityManager->persist($entity);
          $this->entityManager->flush();
      }

  }

Bonjour à tous,
merci à Bidule.
Problème résolu.