Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je voudrais tout simplement ajouter un utilisateur en BDD sans FOSUserBundle.

Voici mon controller:

public function newAction(Request $request, UserPasswordEncoderInterface $passwordEncoder)
    {
        $passwordEncoder = $this->get('security.password_encoder');
        $user = new User();
        $form = $this->createForm('G33\UserBundle\Form\UserType', $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $user->setRoles(array('ROLE_USER'));
            $password = $passwordEncoder->encodePassword($user, $user->getPassword());
            $user->setPassword($password);
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();

            return $this->redirectToRoute('users_show', array('id' => $user->getId()));
        }

        return $this->render('user/new.html.twig', array(
            'user' => $user,
            'form' => $form->createView(),
        ));
    }

Ce que je veux

Le soucis étant qu'a l'enregistrement, tout passe, sauf que le setsalt ben il vaut null vu que je ne met rien.
A savoir que mes pass sont crypté avec bcrypt.
Comment remplir le salt en bdd ?
Sachant que le get salt et set salt sont déjà pret dans mon entité.

Merci.

4 réponses


Flo.S
Réponse acceptée

Le salt, ou "Grain de sel" est une clé privé permettant de complexifier le mot de passe pour le rendre plus sécurisé.

Par exemple :

J'aimerais encrypter mon mot de passe ‘monmotdepasse’ en sha1, en php je vais donc faire :

$pwd = sha1('monmotdepasse');

Ce qui me donne : dd629d39c4576731a2bef003c72ff89d6fc2a99a

Mais, si on veux complexifié le tout, on va utiliser le précieux "Grain de sel" : (dans mon exemple, salt = ‘salt’)

$pwd = sha1('monmotdepasse'.'salt');

Ce qui me donne : 0ae07b9554748a43219743e4ca1fc79c456c3b35

Si tu compare les 2 résultats, tu voie que l'encodage est différent, et cela rend donc la clé crypter plus compliquer à décrypter.

En espérant avoir pu t'éclairer à ce sujet :D

Hello,

C'est un peu con comme question ... Tu le dis toi même : "Il vaut null vue que je ne met rien". Si tu ne fait rien passer au setSalt(), c'est logique.
La seule solution que tu as pour remplire la DB, c'est en passant un argument à ton setSalt(). Sinon, tu dois définir un salt par défaut directement dans le constructeur de ton entité. Dans l'idée :

<?php

class Entite {

  private $salt;

  public function __construct(){
      $this->salt = "MONSALTPARDEFAUT";
  }

}

A voir ci cela peut fonctionner dans ton cas. Sinon, au moment d'encoder,dans ta fonction encodePassword(), il faut que tu charge ton utilisateur, que tu génère le salt, et que tu le persist. Je voie pas trop quoi faire d'autre :/

Certes, je comprend, mais à quoi sert le salt objectivement ?

La doc de symfony contient aussi de précieux renseignements

Using the BCrypt Password Encoder

A salt for each new password is generated automatically and need not be persisted. Since an encoded password contains the salt used to encode it, persisting the encoded password alone is enough.