Commit 39812b7d authored by Thibaut Vallee's avatar Thibaut Vallee
Browse files

UserCreateEvent

parent 908a6d01
Loading
Loading
Loading
Loading
+4 −0
Changes for CHANGELOG.md: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
CHANGELOG

0.5.7 (17/04/2026)
------------------
- UserCreateEvent/Listener

0.5.6 (07/04/2026)
------------------
Bug fixe : Gestion d'un utilisateur qui n'a pas de rôles
+24 −0
Changes for README.md: 24 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -103,6 +103,30 @@ php bin/console unicaen:utilisateur:fixtures
## Historisation
Consulté [Historique.md](documentation/Historique.md) pour l'historisation 

## UserCreateEvent/Listener

[UserCreateEvent](api/src/Event/UserCreateEvent.php) permet à un autre module (par exemple UnicaenAuthentification) de fournir les données d'un utilisateur à creer.
Le listener [UserCreateListener](api/src/Event/UserCreateListener.php) intercepte cet evenement est s'occupe de l'enregistrement en base de données de l'utilisateur.

Usage dans le code d'un autre module :
```php

use Unicaen\Utilisateur\Entity\User;
use Unicaen\Utilisateur\Event\UserCreateEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

//...
   $user = new User();
   $user->setUsername('XXXXX');
   $user->setEmail('XXXXX@faux.mail.fr');
   $user->setDisplayName('XXXX YYYYY');
   $user->setIsActive(true);
   $user->setPassword("changeMe");
   $this->eventDispatcher->dispatch(new UserCreateEvent($user), UserCreateEvent::CREATE_USER);

```


## Contribution

Les contributions sont les bienvenues. Merci de suivre les bonnes pratiques de développement et de soumettre vos pull requests.
+10 −13
Changes for api/src/Command/CreateUserCommand.php: 10 added lines, 13 removed lines.
Original line number Diff line number Diff line
@@ -2,25 +2,27 @@

namespace Unicaen\Utilisateur\Command;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Unicaen\Utilisateur\Entity\Role;
use Unicaen\Utilisateur\Entity\User;
use Unicaen\Utilisateur\Repository\UtilisateurRepository;
use Unicaen\Utilisateur\Service\UtilisateurService;

#[AsCommand(name: 'utilisateur:create-user')]
class CreateUserCommand extends Command
{
    private EntityManagerInterface $entityManager;
    private UtilisateurService $utilisateurService;
    private UserPasswordHasherInterface $passwordHasher;

    public function __construct(EntityManagerInterface $entityManager, UserPasswordHasherInterface $passwordHasher)
    public function __construct(UtilisateurService $utilisateurService,
                                UserPasswordHasherInterface $passwordHasher)
    {
        $this->entityManager = $entityManager;

        $this->utilisateurService = $utilisateurService;
        $this->passwordHasher = $passwordHasher;

        parent::__construct();
@@ -39,7 +41,7 @@ class CreateUserCommand extends Command
        $io->info("Création d'un compte utilisateur local");

        $username = $io->ask('Username');
        $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $username]);
        $existingUser = $this->utilisateurService->findOneBy(['username' => $username]);
        if ($existingUser) {
            $io->error('Un utilisateur avec ce username existe déjà');
            return Command::FAILURE;
@@ -47,7 +49,7 @@ class CreateUserCommand extends Command

        $email = $io->ask('Email');
        // Check if user with same mail exists
        $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
        $existingUser = $this->utilisateurService->findOneBy(['email' => $email]);
        if ($existingUser) {
            $io->error('Un utilisateur avec cette adresse mail existe déjà');
            return Command::FAILURE;
@@ -66,13 +68,8 @@ class CreateUserCommand extends Command
        $user->setDisplayName($dipslayName);
        $user->setEmail($email);
        $user->setPassword($this->passwordHasher->hashPassword($user,$password));
        $roleUser = $this->entityManager->getRepository(Role::class)->findOneBy(['code' => 'ROLE_USER']);
        if ($roleUser) {
            $user->addRole($roleUser);
        }

        $this->entityManager->persist($user);
        $this->entityManager->flush();
        $this->utilisateurService->add($user);

        $io->success('Utilisateur créé.');
        return Command::SUCCESS;
+36 −0
Changes for api/src/Event/UserCreateEvent.php: 36 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Unicaen\Utilisateur\Event;

use Symfony\Contracts\EventDispatcher\Event;
use Symfony\Component\Security\Core\User\UserInterface;
use Unicaen\Utilisateur\Entity\User;

/**
 * Evevenement generer par UnicaenAuthentification lorsque l'authentification est réussite mais qu'il n'y a pas d'utilisateur correspondant
 * (cas d'une première authentification via LDAP/CAS/Shib)
 * Pré-remplie l'utilisateur avec les données issue de l'authentification.
 * Charge au listener éventuel d'enregistrer cette utilisateur en base de données
 */
class UserCreateEvent extends Event
{

    public function __construct(?User $user = null) {
        $this->user = $user;
        return $this;
    }

    protected ?User $user = null;
    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): static
    {
        $this->user = $user;
        return $this;
    }

    public const CREATE_USER = 'unicaen.utilisateur.create-user';
}
+39 −0
Changes for api/src/Event/UserCreateListener.php: 39 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php


namespace Unicaen\Utilisateur\Event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Unicaen\Utilisateur\Entity\User;
use Unicaen\Utilisateur\Repository\UtilisateurRepository;
use Symfony\Component\Security\Core\User\UserInterface;
use Unicaen\Utilisateur\Service\UtilisateurService;

/**
 * Cretion automatique de l'utilisateur si celà est autorisé
 * basé sur
 * @see Symfony\Component\Security\Http\EventListener\UserProviderListener
 */
class UserCreateListener
    implements EventSubscriberInterface
{

    public function __construct(
        private UtilisateurService $utilisateurService,
    ) {}

    public function onCreateUser(UserCreateEvent $userCreateEvent): ?User
    {
        $user = $userCreateEvent->getUser();
        $exist = $this->utilisateurService->findOneBy(['username' => $user->getUsername()]);
        if($exist) {return null;}

        return $this->utilisateurService->add($user);

    }

    public static function getSubscribedEvents(): array
    {
        return [UserCreateEvent::CREATE_USER => ['onCreateUser', 1]];
    }
}
Loading