Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony4] [admin zone] Problèmes de login/pass

Sujet résolu
    19 juillet 2019 à 17:09:27

    Salut,

    Le cherche désespérément à créer une zone réservée dans mon site avec symfony 4.

    J'ai toujours le message d'erreur :

    "Identifiants invalides."

    Je suis certain de mes logins et mots de passe don je sais que ça ne viens pas de là.

    Voici mon security.yaml

    security:
        providers:
            from_database:
                entity:
                    class: App\Entity\User
                    property: email
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: ~
                logout:
                    path: security_logout
                guard:
                    authenticators:
                        - App\Security\LoginFormAuthenticator
                remember_me:
                    secret:   '%kernel.secret%'
                    lifetime: 604800 # 1 week in seconds
                    path:     home                
        encoders:
             App\Entity\User:
                algorithm: argon2i
    
        access_control:
            - { path: ^/admin, roles: ROLE_ADMIN }
      
    


    J'ai créé le formLoginAutenticator avec la ligne de commande symfony

    <?php
    
    namespace App\Security;
    
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
    use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
    use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
    use Symfony\Component\Security\Core\Security;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Csrf\CsrfToken;
    use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
    use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
    use Symfony\Component\Security\Http\Util\TargetPathTrait;
    
    /**
     * Class LoginFormAuthenticator
     * @package App\Security
     */
    class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
    {
        use TargetPathTrait;
    
        /**
         * @var UrlGeneratorInterface
         */
        private $urlGenerator;
        /**
         * @var CsrfTokenManagerInterface
         */
        private $csrfTokenManager;
    
        /**
         * @var UserPasswordEncoderInterface
         */
        private $encoder;
    
        /**
         * LoginFormAuthenticator constructor.
         * @param UrlGeneratorInterface        $urlGenerator
         * @param CsrfTokenManagerInterface    $csrfTokenManager
         * @param UserPasswordEncoderInterface $encoder
         */
        public function __construct(UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $encoder)
        {
            $this->urlGenerator     = $urlGenerator;
            $this->csrfTokenManager = $csrfTokenManager;
            $this->encoder          = $encoder;
        }
    
        /**
         * @param Request $request
         * @return bool
         */
        public function supports(Request $request)
        {
            return 'app_login' === $request->attributes->get('_route')
                && $request->isMethod('POST');
        }
    
        /**
         * @param Request $request
         * @return array|mixed
         */
        public function getCredentials(Request $request)
        {
            $credentials = [
                'email'      => $request->request->get('email'),
                'password'   => $request->request->get('password'),
                'csrf_token' => $request->request->get('_csrf_token'),
            ];
            $request->getSession()->set(
                Security::LAST_USERNAME,
                $credentials['email']
            );
    
            return $credentials;
        }
    
        /**
         * @param mixed                 $credentials
         * @param UserProviderInterface $userProvider
         * @return UserInterface|null
         */
        public function getUser($credentials, UserProviderInterface $userProvider)
        {
            $token = new CsrfToken('authenticate', $credentials['csrf_token']);
            if (!$this->csrfTokenManager->isTokenValid($token)) {
                throw new InvalidCsrfTokenException();
            }
    
            // Load / create our user however you need.
            // You can do this by calling the user provider, or with custom logic here.
            $user = $userProvider->loadUserByUsername($credentials['email']);
            if (!$user) {
                // fail authentication with a custom error
                throw new CustomUserMessageAuthenticationException('Email could not be found.');
            }
    
            return $user;
        }
    
        /**
         * @param mixed         $credentials
         * @param UserInterface $user
         * @return bool
         * @throws \Exception
         */
        public function checkCredentials($credentials, UserInterface $user):bool
        {
    
           // dump($credentials, $user, $credentials['password']);
         //   dump($this->encoder->isPasswordValid($user, $credentials['password']));
    
            return $this->encoder->isPasswordValid($user, $credentials['password']);
    
            // Check the user's password or other credentials and return true or false
            // If there are no credentials to check, you can just return true
            //throw new \Exception('Impossible de se connecter');
        }
    
        /**
         * @param Request        $request
         * @param TokenInterface $token
         * @param string         $providerKey
         * @return RedirectResponse|\Symfony\Component\HttpFoundation\Response|null
         * @throws \Exception
         */
        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('dashboard'));
    
        }
    
        /**
         * @return string
         */
        protected function getLoginUrl()
        {
            return $this->urlGenerator->generate('app_login');
        }
    }
    

    Avez-vous une idée ?

    Merci pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter

    Déployez simplement votre site internet avec Dploy, Évoluez vers une architecture PHP professionnelle

      20 juillet 2019 à 18:13:16

      Les mots de passe sont encryptés en bdd?

      As-tu essayé avec bcrypt à la place de argon2i ?

      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2019 à 21:04:35

        Salut,

        le mot de passe est stocké en bdd. Je teste lundi pour bcrypt. 

        Merci

        • Partager sur Facebook
        • Partager sur Twitter

        Déployez simplement votre site internet avec Dploy, Évoluez vers une architecture PHP professionnelle

          22 juillet 2019 à 12:55:07

          Bonjour,

          En utilisant bcrypt, ça fonctionne sans problème. Du coup je me demande si il n'y aurai pas une extension de PHP à activer.

          En tout cas, merci.

          -
          Edité par colonelMoutarde 22 juillet 2019 à 13:29:02

          • Partager sur Facebook
          • Partager sur Twitter

          Déployez simplement votre site internet avec Dploy, Évoluez vers une architecture PHP professionnelle

            22 juillet 2019 à 14:10:56

            colonelMoutarde a écrit:

            Du coup je me demande si il n'y aurai pas une extension de PHP à activer.

            Pour information:

            PASSWORD_ARGON2I - Utilise l'algorithme de hachage Argon2i pour créer le hachage. Cet algorithme est seulement disponible si PHP a été compilé avec le support d'Argon2

            Source: PHP: password_hash - Manual » Description.

            Il ne faut pas oublier non plus que :

            Disponible à partir de PHP 7.2.0.

            • Partager sur Facebook
            • Partager sur Twitter

            Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

              22 juillet 2019 à 16:35:17

              Je suis en PHP 7.2 et avant de changer pour bcrypt, il générait un mot de pass en argon2i.
              • Partager sur Facebook
              • Partager sur Twitter

              Déployez simplement votre site internet avec Dploy, Évoluez vers une architecture PHP professionnelle

                22 juillet 2019 à 17:08:35

                Je ne saurais pas l'expliquer.

                Mais sur le même serveur avec la même version de PHP j'ai un site qui fonctionne en argon2i (form_login) un autre qui ne fonctionne pas (guard), que j'ai passé en bcrypt.

                En local tout fonctionnait très bien.

                Avec Symfony 4.3 il y a la possibilité de mettre "auto" pour l'encodage du password :

                 App\Entity\User:
                            algorithm: auto

                https://symfony.com/blog/new-in-symfony-4-3-native-password-encoder

                • Partager sur Facebook
                • Partager sur Twitter
                  22 juillet 2019 à 17:14:06

                  Ca sent le bug chez symfony...

                  Le site qui fonctionne a-il suivi les montés de versions progressive ou a il été écrit de zéro en 4.3 (comme moi) ?

                  algorithm: auto,

                  ça ne fonctionne pas non plus (il fait du argon2i)

                  Une issue chez Symfo semble parler de ça :

                  https://github.com/symfony/symfony/issues/32166

                  -
                  Edité par colonelMoutarde 22 juillet 2019 à 17:20:55

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Déployez simplement votre site internet avec Dploy, Évoluez vers une architecture PHP professionnelle

                    22 juillet 2019 à 17:29:33

                    Le site qui fonctionne est en symfony 4.2 écrit de zéro, mais j'utilise pour la connection form_login et non guard.

                    Mais effectivement au vue de l'issue c'est propre à la 4.3.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Symfony4] [admin zone] Problèmes de login/pass

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown