сохранить ввод пароля как sha1() в БД с помощью symfony

Я ломаю голову над самыми простыми вещами.

У меня есть сгенерированная Symfony форма с некоторыми настройками. У меня форма сохраняется просто отлично, за исключением того, что поле «пароль» записывает пароль (как и ожидалось) в обычном формате.

Как я могу перехватить это значение перед записью в базу данных и sha1() перед записью?

Код по существу:

$this->dialog = $request->getParameter('dialog');
$this->form = new UserForm();

if ($this->getRequest()->getMethod() == "POST") {
    $this->form->bind($request->getParameter('user'));
    // intercept here, I suspect
    $user = $this->form->save();
}

РЕДАКТИРОВАТЬ: проблема решена.

в /lib/model/User.php

класс User расширяет BaseUser {

public function save(PropelPDO $con = null)
{

  if ($this->getPassword() != '')
  {
    $this->setPassword(sha1($this->getPassword()));
  }

  return parent::save($con);
}

}

Это довольно очевидно, но не для нуба вроде меня. надеюсь, это поможет кому-то другому. Если есть лучший способ сделать это без расширения функции save(), дайте мне знать?

Ресурс: http://www.symfony-project.org/jobeet/1_4/Propel/en/10 (см.: Защита формы задания с помощью токена)

РЕДАКТИРОВАТЬ № 2: лучший способ сделать это (согласно предложению Града ниже)

В пользовательской модели

public function setPassword($rawPassword) 
{ 
    $salt = "fgv932g2e9dshdfkdjgf927gf8hlz082";
    $password = sha1($salt . $rawPassword); 
    parent::setPassword($password);
}

person David    schedule 09.08.2011    source источник


Ответы (1)


«Лучше» переопределить функцию setPassword() в вашей модели User.

что-то вроде этого:

public function setPassword($rawPassword, $algo = 'sha1', $salt = null) {
  if ($salt === null) {
     $salt = sha1(time().rand().$this->id.$this->username);
  }
  $password = hash($algo, $rawPassword.$salt);
  $this->_set('password', $password);
  $this->_set('password_algo', $algo);
  $this->_set('password_salt', $salt);
}

Таким образом, вы можете установить пароль отовсюду (ваше текущее решение работает только для новых пользователей).

(И, кстати, не забудьте посолить пароль. :-))

person Grad van Horck    schedule 09.08.2011
comment
Привет Град! Спасибо за это. Так очевидно! Тем не менее, я немного обновил вашу функцию, кажется, это лучшая идея (и да, функция очень соленая! ;) ... см. исходный пост! - person David; 09.08.2011
comment
Вы можете сделать его еще более соленым ;-), если вы также сохраните соль в базе данных и сделаете ее динамической для каждого пользователя. (см. мой обновленный код) - person Grad van Horck; 09.08.2011
comment
ржу не могу! слишком много соли вредно для здоровья, знаете ли... хе-хе! :) - person David; 09.08.2011