Symfony 1.3 и формы: пароль меняется, когда я нажимаю «Сохранить», почему? - PullRequest
0 голосов
/ 27 марта 2010

Я установил sfDoctrineGuardUser и создал эту модель, которая наследует модель sfGuardUser:

Usuario:
   inheritance:
     extends: sfGuardUser
     type: simple
   columns:
     nombre_apellidos: string(60)
     sexo: boolean
     fecha_nac: date
     provincia: string(60)
     localidad: string(255)
     email_address: string(255)
     avatar: string(255)
     avatar_mensajes: string(255)

Я также создал модуль под названием «miembros» на основе этой модели.

Хорошо, я нормально захожу через sfGuardAuth / signin, затем я иду в «miembros / edit / id / $ id_of_the_member_i_used_to_log_in» и нажмите «Сохранить» кнопка. Тогда я выхожу.

Если я пытаюсь войти снова, он говорит: «Имя пользователя и / или пароль неверный ".

Позже я понял, что при нажатии кнопки «Сохранить» значение поля «пароль» изменяется (в том числе его зашифрованная версия). Вот почему я не могу войти.

Но почему значение пароля меняется, когда я нажимаю «Сохранить» ???

Привет

1018 * Javi *

Ответы [ 2 ]

0 голосов
/ 11 мая 2010

Вы отображали старый пароль в поле формы пароля? в этом случае он может отображаться в зашифрованном виде и, следовательно, во второй раз при сохранении.

Хэши, как правило, не поддаются расшифровке, поэтому не следует отображать пароль в поле.

Это распространенная проблема при работе с sfGuard. Вот 2 решения, вероятно, есть другие, которые ответят на этот вопрос:

  1. Не позволяйте пользователю менять пароль пользователя в этой форме и создайте отдельную форму для сброса пароля
  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 для добавления дополнительных полей, таких как имя, фамилия и т. Д. Это работает таким образом, возможно, наследование доктрины было бы лучше.

0 голосов
/ 28 марта 2010

Объект sf_guard_user не предназначен для такого расширения посредством наследования. Предусмотрен механизм, позволяющий вам связать объект профиля с пользователем. Я видел, как люди использовали метод, похожий на ваш, но сам не пробовал, поэтому не уверен, что это обычная проблема. Но я бы проверил, что все ваши классы модели и формы должным образом наследуют друг друга, включая классы Pluginxxxx из папки плагина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...