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 :

Symfony error badCredentials [4.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 109
    Par défaut Symfony error badCredentials
    Bonjour à tous,
    j'ai un souci que je ne comprends pas et qui me bloque.
    Actuellement je développe une application Web avec le framework symfony 4.
    Le souci c'est que certains utilisateurs ne peuvent pas se connecter et d'autres oui. La seule difference entre les 2 types d'utilisateurs (ceux qui peuvent se connecter et ceux qui ne peuvent pas) c'est que ceux qui sont créés via les fixtures sont accèptés et ceux créer via l'interface web (généré avec make:crud User) ne le sont pas.
    voici l'erreur que j'ai sortie avec un {{dump(error)}}
    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
    BadCredentialsException {#45 ▼
      -token: PreAuthenticationGuardToken {#249 ▼
        -credentials: null
        -guardProviderKey: null
        -user: null
        -roles: []
        -authenticated: false
        -attributes: []
      }
      #message: "Authentication failed because App\Security\LoginAuthenticator::checkCredentials() did not return true."
      #code: 0
      #file: "/root/Projets/followcarservice2_dev/vendor/symfony/security-guard/Provider/GuardAuthenticationProvider.php"
      #line: 114
      trace: {}
    }
    d'après moi le problème se siturait surement dans le getCredentials mais tout le systeme de sécurité a été généré avec la commande make:auth donc je suis bloqué.
    Si vous souhaitez les codes des Vues/controller je peux vous les fournir mais ils correspondent a ceux de la documentation officielle de symfony 4.3.

    Merci de votre aide,

    Vincent

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    La méthode checkCredentials() a pour unique fonction de vérifier si le hash du mot de passe transmis (via le formulaire de login dans ton cas) correspond au hash stocké en base, si elle ne retourne pas true il y a deux possibilités :
    • Une faute de frappe lors de la saisie du mot de passe (lors du login et/ou lors de la création de l'utilisateur)
    • Une erreur lors du chiffrement du mot de passe (absence de chiffrement, chiffrement effectué plusieurs fois)


    Est-ce que dans le contrôleur qui gère la création d'un User, tu utilises la UserPasswordEncoderInterface pour chiffrer le mot de passe saisi en clair dans le formulaire ?
    (ou via un Doctrine EventSubscriber pour que ce soit fait automatiquement)

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 109
    Par défaut Interface
    Bonjour et merci de prendre du temps pour m'aider.
    Oui il me semble que l'interface est utilisée
    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
    /**
         * @Route("/new", name="user_new", methods={"GET","POST"})
         */
        public function new(Request $request, UserPasswordEncoderInterface $encoder, \Swift_Mailer $mailer): Response
        {
            $user = new User();
            $form = $this->createForm(UserType::class, $user);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $passwordEncoded = $encoder->encodePassword($user, $request->request->get('password'));
                $user->setRoles(array('ROLE_USER'));
                $user->setPassword($passwordEncoded);
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($user);
                $entityManager->flush();
    return $this->render('user/new.html.twig', [
                'user' => $user,
                'form' => $form->createView(),
            ]);
        }
    Je vous donne également le code de User.php je pense que cela peut vous donnez une piste.
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    <?php
     
    namespace App\Entity;
     
    use Doctrine\Common\Collections\ArrayCollection;
    #use Symfony\Component\Security\Core\Security;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use App\Repository\UserRepository;
     
    /**
     * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
     */
    class User implements UserInterface
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=180, unique=true)
         */
        private $email;
     
        /**
         * @ORM\Column(type="json")
         */
        private $roles = [];
     
        /**
         * @var string The hashed password
         * @ORM\Column(type="string")
         */
        private $password;
     
        /**
         * @ORM\OneToMany(targetEntity="App\Entity\Client", mappedBy="user")
         */
        private $clients;
     
        /**
         * @ORM\Column(type="boolean")
         */
        private $isActive;
     
        public function __construct()
        {
            $this->clients = new ArrayCollection();
            $this->isActive = true;
        }
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getEmail(): ?string
        {
            return $this->email;
        }
     
        public function setEmail(string $email): self
        {
            $this->email = $email;
     
            return $this;
        }
     
        /**
         * A visual identifier that represents this user.
         *
         * @see UserInterface
         */
        public function getUsername(): string
        {
            return (string) $this->email;
        }
     
        /**
         * @see UserInterface
         */
        public function getRoles(): array
        {
            $roles = $this->roles;
            // guarantee every user at least has ROLE_USER
            $roles[] = 'ROLE_USER';
     
            return array_unique($roles);
        }
     
        public function setRoles(array $roles): self
        {
            $this->roles = $roles;
     
            return $this;
        }
     
        /**
         * @see UserInterface
         */
        public function getPassword(): string
        {
            return (string) $this->password;
        }
     
        public function setPassword(string $password): self
        {
            $this->password = $password;
     
            return $this;
        }
     
        /**
         * @see UserInterface
         */
        public function getSalt()
        {
            return 'maltego23';
        }
     
        /**
         * @see UserInterface
         */
        public function eraseCredentials()
        {
            // If you store any temporary, sensitive data on the user, clear it here
            // $this->plainPassword = null;
        }
     
        /**
         * @return Collection|client[]
         */
        public function getClients(): Collection
        {
            return $this->clients;
        }
     
        public function addClient(client $client): self
        {
            if (!$this->clients->contains($client)) {
                $this->clients[] = $client;
                $client->setUser($this);
            }
     
            return $this;
        }
     
        public function removeClient(client $client): self
        {
            if ($this->clients->contains($client)) {
                $this->clients->removeElement($client);
                // set the owning side to null (unless already changed)
                if ($client->getUser() === $this) {
                    $client->setUser(null);
                }
            }
     
            return $this;
        }
     
        public function getIsActive(): ?bool
        {
            return $this->isActive;
        }
     
        public function setIsActive(bool $isActive): self
        {
            $this->isActive = $isActive;
     
            return $this;
        }
    }
    auriez vous une idée concernant le fait que les utilisateurs des fixtures peuvent se connecter et pas ceux créés via l'interface ?
    Merci beaucoup de votre aide.

    Vincent

  4. #4
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    A priori ce code est correct. Je me permets deux petites remarques cependant :
    • Tu peux injecter l'EntityManagerInterface dans les arguments de ta méthode new() plutôt que de faire $this->getDoctrine()->getManager();
    • $user->setRoles(array('ROLE_USER')); me semble superflu car la méthode getRoles() retourne toujours le rôle "ROLE_USER"


    Est-ce que tu peux nous montrer la fixture qui crée les utilisateurs stp ?
    Et également le contenu de ton fichier config/security.yaml ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 109
    Par défaut Fixtures et securite.yaml
    Re-bonjour et vraiment merci de vos réponses rapides.

    voici le contenu de ma fixtures
    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
    <?php
     
    namespace App\DataFixtures;
     
    use Doctrine\Bundle\FixturesBundle\Fixture;
    use Doctrine\Common\Persistence\ObjectManager;
    use App\Entity\Client;
    use App\Entity\Vehicule;
    use App\Entity\Reparation;
    use App\Entity\User;
    use Faker;
     
    class AppFixtures extends Fixture
    {
        public function load(ObjectManager $manager)
        {
     
            $julien = new User();
            $julien->setEmail('AT.automobile@mailer.com');
            $julien->setRoles(array('ROLE_USER'));
            $julien->setPassword('$argon2i$v=19$m=1024,t=2,p=2$S0EvNTJoSFYvV0V1VVR4SQ$JJIRQnPMDXg6UOG6zXckZolaSWBfavoLa/IGsVmzgSk');
            $moi = new User();
            $moi->setEmail('agi.v@hotmail.fr');
            $moi->setRoles(array('ROLE_USER', 'ROLE_ADMIN'));
            $moi->setPassword('$argon2i$v=19$m=1024,t=2,p=2$bTFEdU5xY01jM3VIdkw5Tw$V0sjL/Kyhr/O+sncQJHq+3dW57t4N7vFSqfrmLmXCRU');
            $manager->persist($moi);
            $manager->persist($julien);
     
     
            $manager->flush();
        }
    }
    et celui de mon securite.yaml
    Code yaml : 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
    security:
        encoders:
            App\Entity\User:
                algorithm: argon2i
     
        role_hierarchy:
            ROLE_ADMIN: ROLE_USER
     
        # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
        providers:
            users:
                entity:
                    # the class of the entity that represents users
                    class: 'App\Entity\User'
          #  app_user_provider:
          #      entity:
          #          class: App\Entity\User
          #          property: email
            # used to reload user from session & other features (e.g. switch_user)
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: ~
     
                # activate different ways to authenticate
     
                #http_basic: true
                guard:
                    authenticators:
                        - App\Security\LoginAuthenticator
                logout:
                  path: app_logout
                  target: /
                # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
     
                form_login: true
                # https://symfony.com/doc/current/security/form_login_setup.html
     
        # Easy way to control access for large sections of your site
        # Note: Only the *first* access control that matches will be used
        access_control:
             - { path: ^/admin, roles: ROLE_ADMIN }
             - { path: ^/profile, roles: ROLE_USER }

    Je suis un débutant avec Symfony et je souhaite vraiment y arriver.
    Merci de votre aide et je reste a disposition très régulièrement pour vous répondre.

    Vincent

  6. #6
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Dans ton security.yaml, sous "class: App\Entity\User" il manque la clé "property: email" (utilisée pour retrouver l'utilisateur qui tente de s'authentifier), est-ce volontaire ou non ?
    (voir : https://symfony.com/doc/current/secu...-user-provider)

    Peux-tu nous montrer le code de ton LoginAuthenticator stp ?

    Si tu remplaces à la main dans la base de données le hash du password qui ne fonctionne pas avec un de ceux que tu utilises dans la fixture, est-ce que tu réussis à t'authentifier ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/10/2016, 08h53
  2. Symfony erreur 500 Internal Server Error - FileLoaderLoadException
    Par Francisco22 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 11/08/2013, 22h09
  3. [2.x] Symfony 2 / Custom error 503 impossible ?
    Par vgross dans le forum Symfony
    Réponses: 1
    Dernier message: 14/03/2012, 15h01
  4. Réponses: 1
    Dernier message: 23/12/2010, 15h41
  5. [1.x] problème installation symfony ERROR: commit failed
    Par john anderta dans le forum Symfony
    Réponses: 1
    Dernier message: 12/06/2009, 11h05

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