Avez-vous affiché l'ancien mot de passe dans le champ du mot de passe? dans ce cas, il pourrait être affiché crypté et donc crypté une deuxième fois lors de l'enregistrement.
Les hachages ne sont généralement pas déchiffrables, vous ne devriez donc pas afficher le mot de passe sur un champ.
Ceci est un problème courant lorsque vous travaillez avec sfGuard. Voici 2 solutions, il y a probablement d'autres qui répondront à cette question:
- Ne laissez pas le mot de passe de l'utilisateur du changeur d'utilisateur sous cette forme et de créer un formulaire distinct pour le mot de passe réinitialisés
- Laissez-forme de mot de passe champ vide par défaut, et enregistrez-le uniquement lorsque les types d'utilisateur dans un nouveau mot de passe
Je reçois habituellement dans la deuxième voie, voici la classe de formulaire utilisé:
class ewaSfGuardUserForm extends sfGuardUserForm
{
public function configure()
{
// parent::configure();
//"virtual" new password fields, empty by default
$this->widgetSchema['new_password'] = new sfWidgetFormInputPassword();
$this->widgetSchema['new_password_bis'] = new sfWidgetFormInputPassword();
$error_messages = array('min_length' => 'Passwords must be at least 4 characters long.');
$this->validatorSchema['new_password'] = new sfValidatorString(array('required' => false, 'min_length' => 4), $error_messages);
$this->validatorSchema['new_password_bis'] = new sfValidatorString(array('required' => false, 'min_length' => 4), $error_messages);
$error_messages = array('invalid' => 'New password didn\'t match confirmation');
//validate identical password
$this->validatorSchema->setPostValidator(new sfValidatorSchemaCompare('new_password', '==', 'new_password_bis', array(), $error_messages));
$this->validatorSchema->setPostValidator(
new sfValidatorAnd(array(
new sfValidatorDoctrineUnique(array('model' => 'sfGuardUser', 'column' => array('email_address'))),
new sfValidatorDoctrineUnique(array('model' => 'sfGuardUser', 'column' => array('username')), array('invalid' => 'Email is already in use for another account')),
new sfValidatorSchemaCompare('new_password', '==', 'new_password_bis', array(), $error_messages)
))
);
//unused fields
unset(
$this['groups_list'],
$this['permissions_list'],
$this['password'],
$this['created_at'],
$this['updated_at'],
$this['last_login'],
$this['salt'],
$this['algorithm']
);
//putting back validator for real password field
$this->validatorSchema['password'] = new sfValidatorPass();
}
}
le autre partie est en classe d'action sf_guard_userActions
protected function processForm(sfWebRequest $request, sfForm $form)
{
$requestParams = $request->getParameter($form->getName());
$requestParams['password'] = $requestParams['new_password'];
$requestParams['email_address'] = $requestParams['username'];
$form->bind($requestParams, $request->getFiles($form->getName()));
if ($form->isValid())
{
[....] Copy of generated code
}
}
La spécificité de ma mise en œuvre est-il toujours la force utilise email == nom d'utilisateur. Je n'utilise pas de modèle étendu pour stocker le profil de l'utilisateur, mais je remplace la table de doctrine sfGuardUser de defaut pour ajouter des champs supplémentaires comme le prénom, le nom, etc. Cela fonctionne, peut-être que l'héritage de doctrine aurait été meilleur.
Postez le code. Ma baguette magique ne fonctionne pas. –
Quelle partie? --------- – ziiweb
template et action – develop7