Accueil Blog A propos Contact Connexion
Retour à la liste des articles Symfony : empêcher un compte "inactif" de se connecter

Symfony : empêcher un compte "inactif" de se connecter

Olivier Prieur | il y a 3 ans | il y a 7 jours Développement web | 4 | 5553

Dans notre entité User on a notamment cette ligne :

/**

 * @ORM\Column(type="boolean")

 */

private $isActive = true;


(Ci-dessus, isActive = true comme ça à chaque inscription le compte est actif par défaut)

Et les setters et getters :

public function getIsActive(): ?bool

 {

     return $this->isActive;

 }

 public function setIsActive(bool $isActive): self

 {

     $this->isActive = $isActive;

     return $this;

 }


Question : comment refuser la connexion à un utilisateur dont le compte est inactif, c'est à dire qu'il a probalement été désactivé par l'admin pour certaines raisons (spam, non respect des bonnes pratiques sur le site, non paiement, etc.)

C'est relativement simple et ca se passe en deux étapes.

On va créer deux fonctions qui vont "vérifier" la connection : avant et après.

Pour cela, rendez-vous dans /src/Security et créez un nouveau fichier UserChecker.php qui va :

 - vérifier l'instance (c'est bien un $user ?) -> L’opérateur instanceof est utilisé en PHP pour savoir si un objet est une instance instanciée d’une classe.

 - vérifier si le $user en question est bien actif

 - puis s'occuper de ce qui va se passer après que le user est cliqué sur le bouton "Se connecter"

L'objectif n'est pas de refuser la page de connexion au user mais bel et bien de refuser la connexion au compte. Le user pourra donc entrer ses identifiants mais se verra refuser la connexion avec un message d'erreur.

/src/Security/UserChecker.php

<?php

 namespace App\Security;

 

 use App\Entity\User;

 use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;

 use Symfony\Component\Security\Core\User\UserCheckerInterface;

 use Symfony\Component\Security\Core\User\UserInterface;

 

 class UserChecker implements UserCheckerInterface

 {

     public function checkPreAuth(UserInterface $user): void

     {

         if (!$user instanceof User) {

             return;

         }

         if (!$user->getIsActive()) {

             throw new CustomUserMessageAuthenticationException(

                 'Inactive account cannot log in!'

             );

         }

     }

     public function checkPostAuth(UserInterface $user): void

     {

         $this->checkPreAuth($user);

     }

 }


La dernière chose à faire est de dire à Symfony qu'on veut interdire cette connexion.

Ca va se passer dans le fichier /config/packages/security.yaml, dans la section "firewalls" où on va pouvoir mettre la ligne suivante :

user_checker: App\Security\UserChecker

Pour la partie firewall complète, on aura donc :

firewalls:

         dev:

             pattern: ^/(_(profiler|wdt)|css|images|js)/

             security: false

         main:

             lazy: true

             provider: app_user_provider

             custom_authenticator: App\Security\UserAuthenticator

             logout:

                 path: app_logout

                 # where to redirect after logout

                 # target: app_any_route

             user_checker: App\Security\UserChecker


Ainsi, à chaque connexion, le UserChecker va entrer en action et vérifier si le user peut ou non se connecter (isActive = true ou false).

Olivier Prieur

Olivier Prieur

Geek quinqua nivernais fan d'ovalie, de musique, de linuxeries et de Net.
Portfolio : https://www.olivierprieur.fr

Commentaires

En soumettant ce formulaire, j’accepte que ce site conserve mes données personnelles via ce formulaire. Aucune exploitation commerciale ne sera faite des données conservées.

Aude

il y a 1 an

Super, j'ai galéré 3 heures et je tombe sur votre tuto!

Caroline

il y a 11 mois

Merci beaucoup! Super efficace!

Kilenge22

il y a 7 mois

Salut et merci vraiment

citizenz7

il y a 7 mois

@Kilenge22 De rien ;)

A la une

Utiliser TailwindCSS dans un projet Symfony 7

Lire l'article

Symfony 7 avec Docker

Lire l'article

Customiser Easyadmin (2) : avec AssetMapper

Lire l'article

Je recherche un nouveau job !

Lire l'article

Les plus lus

Symfony : barre de recherche dans la sidebar 19385

Lire l'article

Débuter avec Symfony 5 : le fichier .env 11930

Lire l'article

VSCode : 10 raccourcis clavier indispensables (Linux) 11595

Lire l'article

GIT / GITHUB : aide-mémoire pour "les nuls" 10191

Lire l'article