Вы отображали старый пароль в поле формы пароля? в этом случае он может отображаться в зашифрованном виде и, следовательно, во второй раз при сохранении.
Хэши, как правило, не поддаются расшифровке, поэтому не следует отображать пароль в поле.
Это распространенная проблема при работе с sfGuard. Вот 2 решения, вероятно, есть другие, которые ответят на этот вопрос:
- Не позволяйте пользователю менять пароль пользователя в этой форме и создайте отдельную форму для сброса пароля
- По умолчанию поле формы пароля пусто и сохраняет его только тогда, когда пользователь вводит новый пароль
Обычно я иду по второму пути, здесь используется класс формы:
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();
}
}
Другая часть находится в классе действия 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
}
}
Специфика моей реализации в том, что она всегда принудительно использует электронную почту == имя пользователя.
Я не использую расширенную модель для хранения профиля пользователя, но переопределяю таблицу доктрин defaut sfGuardUser для добавления дополнительных полей, таких как имя, фамилия и т. Д. Это работает таким образом, возможно, наследование доктрины было бы лучше.