Développement web
Sécurité
Symfony
PHP
Twig
il y a 2 ans citizenz7 4 commentaires 4819 lectures
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).
Super, j'ai galéré 3 heures et je tombe sur votre tuto!
Merci beaucoup! Super efficace!
Salut et merci vraiment
@Kilenge22 De rien ;)
Blog d'un geek quinqua nivernais fan d'ovalie, de linuxerie, de musique et de Net
@Kilenge22 De rien ;)...
citizenz
19-08-2024
Salut et merci vraiment ...
Kilenge22
18-08-2024
@Denny, c'est à dire ?...
citizenz
10-08-2024
Ah, le printemps ! La nature se réveille, les oiseaux reviennent, on crame des mecs... (Arthur, Kaamelott, Livre II, La Fête du Printemps)