Gérer des utilisateurs sans FosUserBundle 4ème partie

Nous voici arrivés à l’avant-dernière partie qui va demander pas mal de boulot, à savoir la demande de reset de mot de passe s’il a été oublié. Quelques rajouts vont être faits à différents endroits, mais vous allez le voir, aucune modification de code existant, seulement des rajouts et extensions. Le prochain et dernier post traitera du reset en lui-même du mot de passe.

La demande de reset de mot de passe

L’entité RequestPassword

Lorsque nous allons faire une demande de reset du mot de passe via un formulaire, nous pourrons y renseigner l’email ou le username, d’où l’appellation générique identifier.

Mise à jour de l’entité User

A présent que nous allons pouvoir faire une demande de mot de passe oublié, il nous faut un token et un champ vérifiant qu’une demande n’est pas déjà en cours:

 

Le Repository de User

Avant d’aller plus loin, comme nous allons utiliser un event au niveau du formulaire de demande de mot de passe oublié pour vérifier que le username ou l’email rentrés correspondent bien à un user en base, il faut que nous implémentions ces méthodes au niveau du UserRepository qui n’existe pas encore.

  1. Mettons à jour l’entité User en lui indiquant l’endroit de notre repository
  2. Mettons en place cette fonction dans le UserRepository
  3. Permettons au UserManager d’appeler cette méthode

1. L’entité User

2. Le UserRepository

 

3. Le UserManager

Pour faire appel au UserRepository, il doit avoir cette nouvelle dépendance, que l’on va aussi mettre à jour dans le fichier services.xml

 

Le fichier services.xml

Le formType RequestPasswordType

Au moins, grâce à cela, nous saurons si nous passons le $form->isValid() afin de pouvoir lancer la suite des évenements, c’est à dire envoyer le mail via le UserManager.

Ce formulaire a une dépendance, déclarons-le comme un service:

 

Le RequestPasswordFormHandler

Inutile de perdre du temps, vous avez l’habitude à présent, j’utilise systématiquement un handler pour traiter request & soumission de formulaire, et aussi pour déclencher une action au niveau d’une dépendance. Ici, comme d’habitude, nous allons passer comme dépendance le UserManager. Voici donc le handler et la mise à jour du fichier services.xml:

 

Et le fichier services.xml:

Le RequestPasswordController

Avant d’implémenter la fonction sendRequestPassword du UserManager, mettons tout de suite en place le contrôleur:

Rajout de la fonction sendRequestPassword dans le UserManager

Nous allons rajouter cette fonction, mais attention, le UserManager… sert à gérer les utilisateurs, à setter des valeurs, mettre à jour la base, faire une recherche dans un repository. Il n’a pas vocation à envoyer un mail. Non, pour cela, nous allons gaiement créer un autre listener qui se chargera de tout faire:

 

Le listener

Il faut effectuer plusieurs actions ici:

  1. Déclarer la clef de ce listener dans notre fichier AppEvents
  2. Créer le listener
  3. Le déclarer comme un service

 

1. Déclarer la clef du listener

 

2. Créer le listener

Beaucoup de dépendances pour ce listener qui va devoir créer le mail, définir une route avec un token, générer ce token, mettre à jour la base de données… Bien sûr, ce sont ses diverses dépendances qui vont faire le boulot.

Ici, comme je sais déjà que j’ai bien un user en base dont le username ou l’email existent, je n’ai pas besoin de faire de vérification et je demande au UserManager de mettre à jour ce user (nous allons mettre en place la fonction juste après).

Je génère un token avec un service de Symfony qui est le security.csrf.token_generator et qui fait appel à une fonction bien particulière, UriSafeTokenGenerator.

Je fais aussi appel au routeur pour généner ma route (qui n’existe pas encore).

3. Déclarer le listener comme service

Mise à jour du UserManager

Mise en place du mail

Et enfin le template de demande de reset mot de passe

 

N’oubliez pas de mettre de lien au niveau du formulaire du login:

Le code github se trouve ici: https://github.com/jpsymfony/authentication-demo

Rédigé par

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *