IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[5.4] Symfony Custom authentificator : Authentication


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Par défaut [5.4] Symfony Custom authentificator : Authentication
    Bonjour à tous,

    Je suis en train de mettre à jour un site web et j'ai un soucis,

    actuellement le projet utilise Symfony 5.4 et va évoluer en version 6.X prochainement.

    j'utilise les customs_authentificator pour authentifier mes utilisateurs.

    Ma problématique , je n'arrive pas à récupérer sur ma page de login le message d'erreur renvoyé par la méthode onAuthentificationFailure

    j'aimerai pouvoir afficher les message lever avec les exceptions par exemple.

    Actuellement, j'ai juste une page blanche avec l'erreur afficher sans ma page de login.
    Voila mon security.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                lazy: true
                entry_point: form_login
                provider: chain_provider
                user_checker: App\Security\UserChecker
                custom_authenticators:
                    - App\Security\LocalAuthenticator
                    - App\Security\BocalAuthenticator
     
                form_login:
                    # Le nom de la route de la page de connexion
                    check_path: security_login
                    # Le nom de la route où se trouve le formulaire de connexion
                    # Si un utilisateur tente d'acceder à une page protégée sans en avoir les droits
                    # il sera redirigé sur cette page
                    login_path: security_login
                    enable_csrf: true
                    # Securisation des formulaires
                    #csrf_token_generator: security.csrf.token_manager
                    # La page par defaut apres une connexion reussie
                    default_target_path: homepage
                    #https://stackoverflow.com/questions/37630211/symfony3-set-user-last-login-date
                logout:
                    # La route où se trouve le process de deconnexion
                    path: security_logout
                    # La route sur laquelle doit etre rediriger l'utilisateur apres une deconnexion
                    target: homepage
    voici mon controlleur de login
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     /**
         * @Route("/login", name="security_login")
         */
        public function login(AuthorizationCheckerInterface $authorizationChecker , AuthenticationUtils $helper, Request $request): Response
        {
            $access = $authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY');
            if ($access == TRUE)
            {
                return $this->redirectToRoute('homepage');
            }
            return $this->render('security/login.html.twig', [
                // dernier username saisi (si il y en a un)
                'last_username' => $helper->getLastUsername(),
                // La derniere erreur de connexion (si il y en a une)
                'error' => $helper->getLastAuthenticationError(),
     
            ]);
        }
    voici mon localAuthentificator



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
     
    // src/Security/CustomAuthenticator.php
    namespace App\Security;
     
    use App\Entity\AuthLogin;
    use App\Entity\User;
    use App\Repository\UserRepository;
    use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Contracts\HttpClient\HttpClientInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
    use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
    use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
    use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;
    use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
    use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
    use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
    use Symfony\Component\Security\Http\Authenticator\Token\PostAuthenticationToken;
     
    class LocalAuthenticator extends AbstractAuthenticator
    {
        public const LOGIN_ROUTE = "security_login";
     
        public function __construct(
            private UserRepository $userRepository, private UrlGeneratorInterface $urlGenerator, private EntityManagerInterface $em,
        ) {
        }
     
        public function supports(Request $request): bool
        {
     
            return self::LOGIN_ROUTE === $request->attributes->get('_route')
                && $request->isMethod('POST');
        }
     
     
     
        public function authenticate(Request $request): Passport
        {
            $username = $request->request->get('_username');
            $password = $request->request->get('_password');
            // Vérifiez d'abord dans le fournisseur de mémoire
     
            /*dd($this->userProvider);
            $user = $this->userProvider->loadUserByUsername($username);
            if ($user instanceof UserInterface && $this->passwordEncoder->isPasswordValid($user, $password)) {
                return new Passport(new UserBadge($username), new PasswordCredentials($password));
            }*/
     
            $user = $this->em->getRepository(User::class)->findOneBy(['username' => $username]);
     
            if  (!$user)
            {
                throw new CustomUserMessageAuthenticationException('[L] Identifiant incorrect');
            }
     
            $userBadge = new UserBadge($username, function () use ($user) {
                return $user;
            });
            return new Passport($userBadge , new PasswordCredentials($password));
     
        }
     
     
        public function createAuthenticatedToken(PassportInterface $passport, string $firewallName): TokenInterface
        {
            $user = $passport->getUser();
            $roles = $passport->getUser()->getRoles();
            $authenticatedToken = new PostAuthenticationToken($user, $firewallName, $roles);
            return $authenticatedToken;
        }
     
        public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
        {
     
            $auth = new AuthLogin($request->getClientIp(),$token->getUser()->getUsername(), AuthLogin::$success, "");
            $auth->setUser($token->getUser());
            $this->em->persist($auth);
            $this->em->flush();
            return new RedirectResponse($this->urlGenerator->generate(self::LOGIN_ROUTE));
        }
     
        public function onAuthenticationFailure(Request $request, AuthenticationException $exception): Response
        {
            $auth = new AuthLogin($request->getClientIp(), $request->request->get('_username'), AuthLogin::$failed, $exception->getMessage());
            $this->em->persist($auth);
            $this->em->flush();
     
            $response = new Response($exception->getMessage(), Response::HTTP_UNAUTHORIZED);
     
            return $response;
        }
     
        protected function getLoginUrl(Request $request): stvring
        {
            return $this->urlGenerator->generate('security_login');
        }
    et voici mon form de login.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
      <div class="container">
            <div class="row-fluid">
                <div class="col-md-6 offset-md-3 wrapp-login">
                    <form action="{{ path('security_login') }}" method="post">
                        <fieldset>
                            <div class="header-register">
                                <legend><i class="block-epi-blue fa fa-lock fa-2x" aria-hidden="true"></i></legend>
                            </div>
                            {% if error %}
                                <div class="alert alert-danger text-center">
                                    {{ error.messageKey|trans(error.messageData, 'security') }}
                                </div>
                            {% endif %}
     
                            <div class="form-group">
                                <label for="username">Email</label>
                                <input type="text" id="username" name="_username" value="{{ last_username }}" class="form-control"/>
                            </div>
                            <div class="form-group">
                                <label for="password">Mot de passe</label>
                                <input type="password" id="password" name="_password" class="form-control" />
                            </div>
                            <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>
                            <button type="submit" class="btn background-epi-blue color-white">
                                <i class="fa fa-sign-in" aria-hidden="true"></i> On entre
                            </button>
                        </fieldset>
                    </form>
                </div>
            </div>
        </div>

  2. #2
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 431
    Par défaut
    Bonjour,

    Actuellement tu as une page blanche avec le message d'erreur car ta méthode onAuthentificationFailure retourne une Response 401 avec le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        /* LocalAuthenticator::onAuthenticationFailure() */
        $response = new Response($exception->getMessage(), Response::HTTP_UNAUTHORIZED);
        return $response;
    Cette méthode devrait retourner la valeur null pour continuer le traitement de la requête.

    Au passage, il ne faut pas utiliser $exception->getMessage() car ce dernier peut contenir des informations sensibles, à la place il est recommandé d'utiliser $exception->getMessageKey() et $exception->getMessageData()

    https://symfony.com/doc/5.4/security...enticator.html

Discussions similaires

  1. IIS redirection custom authentification windows
    Par didou000 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/09/2014, 09h47
  2. [INSTALLATION] BO XI 3.1 - custom authentification
    Par LEK dans le forum Administration-Migration
    Réponses: 3
    Dernier message: 27/09/2012, 16h56
  3. [2.x] [symfony 2] authentification http
    Par david42 dans le forum Symfony
    Réponses: 1
    Dernier message: 09/03/2012, 16h26
  4. basichttpbinding custom authentification
    Par olibara dans le forum Services Web
    Réponses: 7
    Dernier message: 16/03/2010, 17h08
  5. Authentification (Form Based Authentication)
    Par kymior23 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 29/04/2009, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo