Authentification et inscription avec Symfony
Authentification et inscription avec Symfony
-
Objectifs
- Ce tutoriel décrit les processus condissant à la mise en place d’un formulaire d’inscription et de connexion dans symfony
-
Créer la partie connexion (Authentification)
- Maintenant que nous avons notre entité « Users » et que notre fichier de configuration « security.yaml » est à jour, nous allons pouvoir mettre en place nos pages de connexion et de déconnexion.
- Une nouvelle fois la console va nous permettre de dégrossir le travail et produire le contrôleur, le fichier de configuration et le formulaire de connexion.
- Dans votre terminal, tapez cette commande :
symfony bin/console make:auth
. Vous pouvez aussi utiliser une autre commande :php bin/console make:auth
- What style of authentication do you want? [Empty authenticator] :
- Nous choisissons « 1 » afin de créer notre formulaire d’identification automatiquement.
- The class name of the authenticator to create (e.g. AppCustomAuthenticator) :
- On nous demande de choisir un nom au fichier qui se chargera de l’authentification : ça sera « UserAuthenticator ».
- Choose a name for the controller class (e.g. SecurityController) [SecurityController] :
- Même chose ici : nous devons choisir un nom pour le contrôleur qui contient les routes vers le formulaire de connexion et vers la déconnexion. Je choisis celui fourni par défaut : « SecurityController« .
- Do you want to generate a ‘/logout’ URL? (yes/no) [yes] :
- Nous répondons « yes » afin de donner la possibilité à l’utilisateur de se déconnecter.
- Do you want to support remember me? (yes/no) [yes]:
- Cette question vise à déterminer si vous souhaitez inclure la fonctionnalité « Remember Me » dans votre système d’authentification. Si vous répondez « yes » (oui), Symfony inclura alors le support pour « Remember Me« . Cela signifie que les utilisateurs auront la possibilité de rester connectés à votre application même après avoir fermé leur navigateur, grâce à un mécanisme qui stocke un cookie persistant sur leur appareil.
- Si vous répondez « no » (non), la fonctionnalité « Remember Me » ne sera pas incluse dans votre système d’authentification, et les utilisateurs devront se connecter à nouveau à chaque visite sur votre site.
- How should remember me be activated? [Activate when the user checks a box]:
[0] Activate when the user checks a box
[1] Always activate remember me - Cette question concerne la méthode d’activation de la fonctionnalité « Remember Me » dans votre système d’authentification Symfony. Voici ce que chaque option signifie :
- Activate when the user checks a box (Activer lorsque l’utilisateur coche une case) : Si vous choisissez cette option (0), la fonctionnalité « Remember Me » sera activée uniquement lorsque l’utilisateur coche une case spécifique sur le formulaire de connexion. Cela signifie que l’utilisateur a le contrôle sur le fait d’utiliser ou non cette fonctionnalité.
- Always activate remember me (Toujours activer remember me) : Si vous choisissez cette option (1), la fonctionnalité « Remember Me » sera toujours activée, quel que soit le comportement de l’utilisateur sur le formulaire de connexion. Cela signifie que chaque fois qu’un utilisateur se connecte à votre application, il sera automatiquement « reconnu » lors de ses futures visites, à moins qu’il ne se déconnecte explicitement.
- Trois fichiers ont été générés pour la gestion de l’authentification :
- src/Security/UserAuthenticator.php : Ce fichier contient la logique de l’authentification de l’utilisateur.
- src/Controller/SecurityController.php : Ce contrôleur gère les actions liées à l’authentification, telles que la connexion et la déconnexion de l’utilisateur.
- templates/security/login.html.twig : Ce fichier Twig est responsable de l’affichage du formulaire de connexion.
- Bien que le système d’authentification fonctionne, quelques ajustements sont nécessaires pour le finaliser.
- Dans le fichier src/Security/UserAuthenticator.php, ouvrez la méthode onAuthenticationSuccess(). Actuellement, cette méthode redirige l’utilisateur vers une page par défaut après son identification. Nous devons définir un chemin de redirection personnalisé. Dans le commentaire de la méthode, le code nécessaire est fourni. Ajoutez le nom de la route vers laquelle vous souhaitez rediriger l’utilisateur :
- Dans le fichier src/Controller/SecurityController.php, ouvrez la méthode login(). Décommentez le code au début de la méthode. Ce morceau de code permet de rediriger automatiquement l’utilisateur vers une autre page s’il est déjà authentifié et tente d’accéder à la page de connexion :
- Vous pouvez également personnaliser le formulaire de connexion dans le fichier templates/security/login.html.twig, par exemple en le traduisant ou en lui donnant un aspect visuel plus attrayant.
- Deux routes sont disponibles pour l’authentification :
- Pour se connecter : /login, avec le nom de route app_login.
- Pour se déconnecter : /logout, avec le nom de route app_logout.
-
Création de Formulaire d’inscription
- A présent, pour créer le formulaire d’inscription nous allons taper :
Symfony console make :registration-form
. Vous pouvez aussi utiliser une autre commande:php bin/console make:registration-form
- Cette commande va créer une nouvelle classe de formulaire dans votre application Symfony, spécifiquement conçue pour l’inscription des utilisateurs. Vous pouvez ensuite ajouter les champs nécessaires pour le formulaire d’inscription, tels que l’e-mail, le mot de passe, le nom d’utilisateur, etc.
- Apres exécution de la commande, nous avons également des questions de la part du console
- Do you want to add a @UniqueEntity validation annotation on your Users class to make sure duplicate accounts aren’t created? (yes/no) [yes] :
- Je vous conseille de répondre yes à cette question, car cela permet d’éviter que plusieurs comptes utilisateur utilisent la même adresse e-mail.
- Do you want to send an email to verify the user’s email address after registration? (yes/no) [yes] :
- Ici, on nous demande si l’on veut envoyer un e-mail à l’utilisateur afin de vérifier la validité de son adresse e-mail.
- What email address will be used to send registration confirmations? e.g. mailer@your-domain.com :
- Si vous avez répondu oui à la question précédente, entrez une adresse e-mail. Elle sera utilisée en tant qu’adresse expéditeur.
- What « name » should be associated with that email address? e.g. « Acme Mail Bot » :
- Entrez ici un nom qui sera utilisé lors de l’envoi de l’e-mail de vérification.
- Do you want to automatically authenticate the user after registration? (yes/no) [yes] :
- Répondez oui si vous souhaitez connecter automatiquement l’utilisateur une fois qu’il est inscrit.
- What route should the user be redirected to after registration? :
- Si vous avez répondu non à la question précédente, entrez le nom d’une route existante pour rediriger l’utilisateur. Cependant, il ne sera pas connecté automatiquement.
- Après avoir créé le formulaire d’inscription, vous pouvez l’intégrer dans votre application et le rendre accessible aux utilisateurs pour qu’ils puissent s’inscrire. Vous devrez également implémenter la logique nécessaire pour traiter les données soumises par le formulaire et créer de nouveaux utilisateurs dans votre système.
-
Mot de passe oublié ?
- Continuons à explorer les fonctionnalités offertes par Symfony. Abordons maintenant le processus de réinitialisation de mot de passe oublié !
- Dans votre terminal, saisissez la commande suivante pour installer le bundle nécessaire :
composer require symfonycasts/reset-password-bundle
- Ce bundle n’est pas inclus par défaut, c’est pourquoi vous devez l’installer explicitement. Ensuite, exécutez la commande suivante pour démarrer le processus de création de la fonctionnalité de réinitialisation de mot de passe :
symfony console make:reset-password
. Vous pouvez également utiliser la commande suivante :php bin/console make:reset-password
- Cela déclenchera une série de nouvelles étapes et de questions pour configurer la réinitialisation de mot de passe.
- What route should users be redirected to after their password has been successfully reset? [app_home] :
- Une fois que l’utilisateur a correctement modifié son mot de passe, où le rediriger ? Le mieux reste le formulaire de connexion soit « app_login ».
- What email address will be used to send reset confirmations? e.g. mailer@your-domain.com :
- Ici, nous pouvons choisir l’adresse e-mail utilisée pour envoyer l’e-mail permettant de modifier le mot de passe.
- What « name » should be associated with that email address? e.g. « Acme Mail Bot » :
- On définit le nom qui sera affiché dans le mail de modification du mot de passe envoyé.
- Mettez à jour votre base de données avec la commande suivante :
symfony console doctrine:schema:update --force
. Vous pouvez aussi utiliser une autre commande:php bin/console doctrine:update:schema --force
-
Conclusion
- Et voila, grâce a ces 4 commandes vous avez:
- une entité User
- une page de connexion
- une page d’enregistrement
- une page de récupération de mot de passe
- Voici la liste des commandes utilisées au long de cet article. Vous pouvez les exécuter et vous laissez guider :
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
return new RedirectResponse($targetPath);
}
return new RedirectResponse($this->urlGenerator->generate('account'));
}
/**
* @Route("/login", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('account');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
composer require symfonycasts/reset-password-bundle
php bin/console make:user
php bin/console make:auth
php bin/console make:registration-form
php bin/console make:reset-password