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

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

Imaginons que nous ayons un ou plusieurs utilisateurs sur notre site dont le compte a été passé à "Inactif".

Comment empêcher cet utilisateur (user) de se connecter ?

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/SecurityUserChecker.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)
    {
        if (!$user instanceof User) {
            return;
        }
        if (!$user->getIsActive()) {
            throw new CustomUserMessageAuthenticationException(
                'Inactive account cannot log in!'
            );
        }
    }
    public function checkPostAuth(UserInterface $user)
    {
        $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).

citizenz7
Posté par citizenz7

Geek quinqua nivernais fan d'ovalie, de linuxerie, de musique et de Net

0 commentaire

Laisser un commentaire

Votre adresse email ne sera pas publiée.

Email:
Pseudo:
Message:
Accepter les CGU
Recopiez le code antispam: