Commit 9f843a34 authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Ajout d'un clef de configuration ['reset_password']['identification'] pour la...

Ajout d'un clef de configuration ['reset_password']['identification'] pour la récupération des utilisateur·trices lors du reset du mot de passe
parent 7d0a28e2
Loading
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
# CHANGELOG

7.1.0 (11/12/2025)
---
- Ajout d'un clef de configuration ['reset_password']['identification'] pour la récupération des utilisateur·trices lors du reset du mot de passe 

7.0.2 (11/12/2025)
---
- Ajustement des dépendances

7.0.1 (05/12/2025)
---
 - Correctif d'accesseur pour IsAccessibleExterieur

7.0.0 (20/11/2025)
------------------

+11 −0
Original line number Diff line number Diff line
@@ -22,6 +22,17 @@ return [
                'username' => 'supannaliaslogin',
            ],
        ],

        'reset_password' =>
            [
                /** Lors de reset de mot de passe, on utilise un attribut utilisé dans un findOneBy.
                 * La clé 'identification' permet de modifier celle-ci.
                 * Remarques
                 *  - Si absente ou laissée vide alors, on reste sur l'attribut historique qui est 'username'.
                 *  - Par défaut, on admet le username est le mail de l'utilisateur (ce qui peut être incohérent avec des mécaniques de unicaen/utilisateur)
                 */
                'identification' => 'username'
            ],
    ],
];

+23 −5
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace UnicaenAuthentification\Controller;

use Doctrine\ORM\NonUniqueResultException;
use DomainException;
use UnicaenApp\Controller\Plugin\AppInfos;
use UnicaenApp\Controller\Plugin\Mail;
@@ -9,7 +10,6 @@ use UnicaenApp\Exception\RuntimeException;
use UnicaenAuthentification\Authentication\Adapter\Cas;
use UnicaenAuthentification\Authentication\Adapter\LocalAdapter;
use UnicaenAuthentification\Authentication\Adapter\Shib;
use UnicaenAuthentification\Entity\Db\Role;
use UnicaenAuthentification\Form\LoginForm;
use UnicaenAuthentification\Options\Traits\ModuleOptionsAwareTrait;
use UnicaenAuthentification\Service\ShibService;
@@ -108,6 +108,19 @@ class AuthController extends AbstractActionController
     */
    protected $failedLoginMessage = "L'authentification a échoué, merci de réessayer.";

    private string $identificationAttribute = 'username';

    public function getIdentificationAttribute(): string
    {
        return $this->identificationAttribute;
    }

    public function setIdentificationAttribute(string $identificationAttribute): void
    {
        $this->identificationAttribute = $identificationAttribute;
    }


    /**
     * Login form
     */
@@ -393,10 +406,15 @@ class AuthController extends AbstractActionController
    /**
     * @param string $email
     */
    private function processPasswordResetRequest(string $email)
    private function processPasswordResetRequest(string $value): void
    {
        // Recherche de l'utilisateur ayant pour *username* (login) l'email spécifié
        $user = $this->userService->getUserMapper()->findOneByUsername($email);
        $start = true;
        // Recherche de l'utilisateur·trice
        try {
            $user = $this->userService->getUserMapper()->findOne($this->getIdentificationAttribute(), $value);
        } catch (NonUniqueResultException $e) {
            throw new RuntimeException("Échec de la récupération de l'utilisateur·trice pour [" . $this->getIdentificationAttribute().":".$value."]. Veuillez contactez votre assistance.");
        }

        if ($user === null) {
            // Aucun utilisateur trouvé ayant l'email spécifié :
@@ -422,7 +440,7 @@ class AuthController extends AbstractActionController
<p>Cliquez sur le lien suivant pour accéder au formulaire de changement de votre mot de passe :<br><a href='$changePasswordUrl'>$changePasswordUrl</a></p>
EOS;
        $message = $this->mail()->createNewMessage($body, $subject);
        $message->setTo($email);
        $message->setTo($user->getEmail());
        $this->mail()->send($message);
    }

+8 −2
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
namespace UnicaenAuthentification\Controller;

use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use UnicaenAuthentification\Form\LoginForm;
use UnicaenAuthentification\Options\ModuleOptions;
use UnicaenAuthentification\Service\ShibService;
@@ -13,8 +15,8 @@ use ZfcUser\Controller\RedirectCallback;
class AuthControllerFactory
{
    /**
     * @param ContainerInterface $container
     * @return AuthController
     * @throws NotFoundExceptionInterface
     * @throws ContainerExceptionInterface
     */
    public function __invoke(ContainerInterface $container): AuthController
    {
@@ -47,6 +49,10 @@ class AuthControllerFactory
            $controller->addLoginForm($loginForm);
        }

        $config = $container->get('config');
        $attribute = $config['unicaen-auth']['reset_password']['identification']??null;
        if ($attribute !== null) $controller->setIdentificationAttribute($attribute);

        return $controller;
    }
}
 No newline at end of file
+14 −1
Original line number Diff line number Diff line
@@ -2,7 +2,10 @@

namespace UnicaenAuthentification\Service;

use Doctrine\DBAL\Exception\NonUniqueFieldNameException;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use http\Exception\RuntimeException;
use UnicaenUtilisateur\Entity\Db\AbstractUser;
use UnicaenAuthentification\Options\ModuleOptions;
use ZfcUser\Entity\UserInterface as UserEntityInterface;
@@ -92,7 +95,17 @@ class UserMapper implements UserInterface
    }
    //===================


    /**
     * @throws NonUniqueResultException
     */
    public function findOne(string $attribute, ?string $value): ?AbstractUser
    {
        /** @var AbstractUser $user */
        $qb = $this->em->getRepository($this->options->getUserEntityClass())->createQueryBuilder('user')
            ->andWhere('user.'.$attribute.' = :value')->setParameter('value', $value);
        $result = $qb->getQuery()->getOneOrNullResult();
        return $result;
    }

    /**
     * Recherche un utilisateur par son username (identifiant de connexion).