EDIT
je pense que c'est effectivement la fonction de hashage bcrypt qui ne fonctionne pas
lorsque je passe en plaintext, le login fonctionne
j'ai essayé en SHA512 pour voir en essayant de décrypte en ligne et il ne me trouve aucune correspondance...
Bonjour,
Voila je rencontre un petit problème avec mon code.
J'ai créé un formulaire de connexion à partir d'une entité Abonne que j'ai créé et lié à ma base MySql (MAMP).
je peux enregistrer mes des abonnes dans la tables Abonne et j'encode le mot de passe à l'aide de bcrypt.
mais je ne parviens pas à me connecter avec les comptes que je créé ; tout se passe comme si le mot de passe n'était pas reconnu et j'ai le message "Invalid credentials."
security.yalm
security:
encoders:
App\Entity\Abonne:
algorithm: bcrypt
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
in_memory: { memory: ~ }
in_database:
entity:
class: App\Entity\Abonne
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: true
provider: in_database
form_login:
login_path: security_login
check_path: security_login
Abonne.php
<?php
namespace App\Entity;
use Serializable;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\AbonneRepository")
* @UniqueEntity(
* fields={"email"},
* message= "L'email que vous avez tapé est déjà utilisé"
* )
*/
class Abonne implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $nomAbonne;
/**
* @ORM\Column(type="string", length=255)
*/
private $PrenomAbonne;
/**
* @ORM\Column(type="string", length=20)
* @Assert\Length(min="8", minMessage="Votre mot de passe doit faire 8 caractères minimum")
*/
private $motDePasseAbonne;
/**
* @Assert\EqualTo(propertyPath="motDePasseAbonne", message="Mot de passe non confirmé")
*/
public $confirmMotDePasseAbonne;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Email()
*/
private $email;
public function getId(): ?int
{
return $this->id;
}
public function getNomAbonne(): ?string
{
return $this->nomAbonne;
}
public function setNomAbonne(string $nomAbonne): self
{
$this->nomAbonne = $nomAbonne;
return $this;
}
public function getPrenomAbonne(): ?string
{
return $this->PrenomAbonne;
}
public function setPrenomAbonne(string $PrenomAbonne): self
{
$this->PrenomAbonne = $PrenomAbonne;
return $this;
}
public function getMotDePasseAbonne(): ?string
{
return $this->motDePasseAbonne;
}
public function setMotDePasseAbonne(string $motDePasseAbonne): self
{
$this->motDePasseAbonne = $motDePasseAbonne;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
//méthode à implémenter
public function getPassword() {}
public function getUsername() {}
public function eraseCredentials(){}
public function getSalt() { return null; }
public function getRoles() {
return['ROLE_USER'];
}
}
SecurityController.php
<?php
namespace App\Controller;
use App\Entity\Abonne;
use App\Form\RegistrationType;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @Route("/inscription", name="security_registration")
*/
public function registration(Request $request, ObjectManager $manager,UserPasswordEncoderInterface $encoder)
{
$abonne = new Abonne();
$form = $this->createForm(RegistrationType::class, $abonne);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$hash = $encoder->encodePassword($abonne, $abonne->getMotDePasseAbonne());
$abonne->setMotDePasseAbonne($hash);
$manager->persist($abonne);
$manager->flush();
return $this->redirectToRoute('security_login');
}
return $this->render('security/registration.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/connexion", name="security_login")
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils){
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this-> render('security/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,));
}
}
login.html.twig
{% extends 'base.html.twig' %}
{% block body %}
<h1>Connexion</h1>
{% if error %}
<div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<form action="{{ path('security_login') }}" method="post">
<div class="form-group">
<input placeholder="Adresse email" required name="_username" value="{{ last_username }}" type="text" class="form-control">
</div>
<div class="form-group">
<input placeholder="Mot de passe" required name="_password" type="password" class="form-control">
</div>
<div class="form-group">
<button class="btn btn-success">Connexion</button>
</div>
</form>
{% endblock %}