Проблем при Update зашифрованного пароля!
Проблем при Update зашифрованного пароля!
Перед тем как создать тему, подумал как решить но видимо думалка слабовата , поиск ничего не дал, странно канешно ведь по идее в каждом блоге подобное нужно решать, выходит что один я такой непонятный.
Имею одну модель manageUsers и в views create ->_create_form и update -> _update_form, соотвественно две формы используют одну модель, в моделе перед сейвом функцией beforeSave пароль заганяю в md5, проблем с create нету, а вот при update
Когда мы редактируем например Имя, при сохранении зашифрованый пароль шыфруеться еще раз, и будем совсем новый пероль не извесный юзеру, в принцыпе никому.
Самым оптимальным вариантом было бы в форму update_form в поле пароля не возвращать значение из БД пароля, при сохранении update его не трогало, и при вводе нового пароля перезаписывался, с Бд заполняетьс к полю пароля value="" пытался задать $form->passwordField($model, $value=' ', 'password'); выдает ошибку. коротче запутался, или я неправильным путем иду, надеюсь понятно изложил проблему, прошу совета! кто как решает подобные вопросы?
Имею одну модель manageUsers и в views create ->_create_form и update -> _update_form, соотвественно две формы используют одну модель, в моделе перед сейвом функцией beforeSave пароль заганяю в md5, проблем с create нету, а вот при update
Когда мы редактируем например Имя, при сохранении зашифрованый пароль шыфруеться еще раз, и будем совсем новый пероль не извесный юзеру, в принцыпе никому.
Самым оптимальным вариантом было бы в форму update_form в поле пароля не возвращать значение из БД пароля, при сохранении update его не трогало, и при вводе нового пароля перезаписывался, с Бд заполняетьс к полю пароля value="" пытался задать $form->passwordField($model, $value=' ', 'password'); выдает ошибку. коротче запутался, или я неправильным путем иду, надеюсь понятно изложил проблему, прошу совета! кто как решает подобные вопросы?
Последний раз редактировалось ynik 2010.05.30, 16:56, всего редактировалось 1 раз.
Re: Проблем при Update зашифрованного пароля!
по ходу доследил что для update возвращает значения вот эта функция
вот согласно айди взятого с $_GET, делаеться выборка с БД, и заполняються поля если не пустые, нужно наверно в findbyPk задать условие, нужно выполнить типа может через другой find. Как правильно и грамотно составить запрос через find и какой , или же как же исключить поле пароля вопрос тогда конкретнее
Код: Выделить всё
public function loadModel()
{
if($this->_model===null)
{
if(isset($_GET['id']))
$this->_model=Manage_users::model()->findbyPk($_GET['id']);
if($this->_model===null)
throw new CHttpException(404,'The requested page does not exist.');
}
return $this->_model;
}
Код: Выделить всё
"SELECT username, email, first_name, last_name FROM `user` WHERE `id`='". $_GET['id'] ."'"
Re: Проблем при Update зашифрованного пароля!
Я бы просто убрал хеширования пароля из метода beforeSave();
Т.к. его хеширования нужно всего в двух случаях:
1) Создании нового пользователя
2) Смена пароля
А так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что. Тут надо решить проблему когда писать поле "пароль" в БД, а когда не писать...
Т.к. его хеширования нужно всего в двух случаях:
1) Создании нового пользователя
2) Смена пароля
А так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что. Тут надо решить проблему когда писать поле "пароль" в БД, а когда не писать...
Re: Проблем при Update зашифрованного пароля!
Вставь в beforesave() проверку if($this->isNewRecord) чтобы пароль дважды не шифровался.
Re: Проблем при Update зашифрованного пароля!
beforeSave(); у меня один на create и update, значит если мы создаем и редактируем он будет хешироваться, уберем его с update не будет при создании, и смене пароля.
немного не понял но если мы в update не выводим у нас чистое поле, в беде у нас пароль 123456 в зашифрованом виде, при update он не перезаписываеться, если ввели новый пароль хешируеться и переписываеться, я так понимаю это делоА так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что.
Re: Проблем при Update зашифрованного пароля!
vlastachuvlastachu писал(а):Вставь в beforesave() проверку if($this->isNewRecord) чтобы пароль дважды не шифровался.
if($this->isNewRecord) он работает не переписываеться, при изменении других полей, но когда меняем пароль на другой все он не хешируеться, а так прямиым текстом в БД и летит что не есть гуд
Re: Проблем при Update зашифрованного пароля!
Ну а что не понятного? Оставите поле пустым, в БД запишется хешь от пустого поля.ynik писал(а):beforeSave(); у меня один на create и update, значит если мы создаем и редактируем он будет хешироваться, уберем его с update не будет при создании, и смене пароля.немного не понял но если мы в update не выводим у нас чистое поле, в беде у нас пароль 123456 в зашифрованом виде, при update он не перезаписываеться, если ввели новый пароль хешируеться и переписываеться, я так понимаю это делоА так даже если не загрузить пароль из БД, и оставить поле пустым, то в БД будет все равно писать не пойми что.
Re: Проблем при Update зашифрованного пароля!
AbS а понял с поля вычитать данные не выход.
тогда пытаюсь переделать фунцию beforesave по ходу там нужно сверить введен ли новый пароль если да то шифровать если нет не трогать
тогда пытаюсь переделать фунцию beforesave по ходу там нужно сверить введен ли новый пароль если да то шифровать если нет не трогать
Последний раз редактировалось ynik 2010.05.30, 21:10, всего редактировалось 1 раз.
Re: Проблем при Update зашифрованного пароля!
А как в таком случае поступать при Изменение пароля?ynik писал(а):AbS а понял.
тогда пытаюсь переделать фунцию beforesave по ходу там нужно сверить введен ли новый пароль если да то шифровать если нет не трогать
имхо БефоСейф() не то место где следует шифровать пароль.
Re: Проблем при Update зашифрованного пароля!
а где его тогда шифровать перед сейвом в экшене контроллера разве что, но если б это решало мою проблемму, в даном случае я не знаю как ее решить не там ни там не выходит, наверно надо отойти немного от компа мож мысля придет
Re: Проблем при Update зашифрованного пароля!
Хм. Я просто думал, что вам не надо менять пароль. (что кстати нормально - пользователи в основном меняют пароли на частопосещаемых сайтах вроде соц. сетей)
Для смены пароля лучше сделать отдельную форму, а то в update пользователь увидит зашифрованный пароль, что может привести его в когнитивный диссонанс.
Или поискать как расшифровывать md5 с солями (я кстати как-то не находил...).
Для смены пароля лучше сделать отдельную форму, а то в update пользователь увидит зашифрованный пароль, что может привести его в когнитивный диссонанс.
Или поискать как расшифровывать md5 с солями (я кстати как-то не находил...).
Re: Проблем при Update зашифрованного пароля!
я вот думаю вот так бы сделать в бефоре сейв
по другому уже даже не знаю как можно придумать.
вот что то типа этого работает, пароль юзера с БД вручну сдесь втыкнул для проверки будет ли работать так , его бы как то вытянуть, к редактируемому юзеру.
при таком раскладе создаеться новый , редактируэться другие поля и пароль если равно паролю в Бд не трогаеться, если не равно паролю в Бд выполняеться первый блок и хешируеться новый пароль, вопрос узнать пароль юзера который редактируеться?
канешно это все в моделе делать по мойму не то, а по другому даже не знаю.
Но все ж таки поле пустое было бы лутше при редактировании, тогда сделать проверку типа как вверху что если оно пустое то не шифровать ниче, и не надо доставать с Бд для сопоставления паролей, раз так и пустые поля тоже шифруються, но как?
по другому уже даже не знаю как можно придумать.
Код: Выделить всё
public function beforeSave()
{
if($this->password !== 'bbc345e31396a86ed174c4ac40117813')//код сдесь пароль в хеше его бы узнать и подставлять
{
$salt = self::randomSalt();
$this->password = self::hashPassword($this->password, $salt);
$this->salt = $salt;
}else{
if($this->isNewRecord)
{
$salt = self::randomSalt();
$this->password = self::hashPassword($this->password, $salt);
$this->salt = $salt;
}
}
return true;
}
при таком раскладе создаеться новый , редактируэться другие поля и пароль если равно паролю в Бд не трогаеться, если не равно паролю в Бд выполняеться первый блок и хешируеться новый пароль, вопрос узнать пароль юзера который редактируеться?
канешно это все в моделе делать по мойму не то, а по другому даже не знаю.
Но все ж таки поле пустое было бы лутше при редактировании, тогда сделать проверку типа как вверху что если оно пустое то не шифровать ниче, и не надо доставать с Бд для сопоставления паролей, раз так и пустые поля тоже шифруються, но как?
Re: Проблем при Update зашифрованного пароля!
Почему бы в условии не воспользоваться "||" ?
А насчёт проверки, то тут не сложно: просто каждому аттрибут у таблицы присвоить соответствующее значение, а пароль проверить отдельно.
Вроде
$data->row1 = $_POST['data']['row1']
...
if($data->password !== $_POST['data']['password'])
{...}
Дальше извиняюсь не читал - поздно уже)
А насчёт проверки, то тут не сложно: просто каждому аттрибут у таблицы присвоить соответствующее значение, а пароль проверить отдельно.
Вроде
$data->row1 = $_POST['data']['row1']
...
if($data->password !== $_POST['data']['password'])
{...}
Дальше извиняюсь не читал - поздно уже)
Re: Проблем при Update зашифрованного пароля!
Потому что так ни кто не делает.vlastachu писал(а):Почему бы в условии не воспользоваться "||" ?
А насчёт проверки, то тут не сложно: просто каждому аттрибут у таблицы присвоить соответствующее значение, а пароль проверить отдельно.
Вроде
$data->row1 = $_POST['data']['row1']
...
if($data->password !== $_POST['data']['password'])
{...}
Дальше извиняюсь не читал - поздно уже)
Читайте про безопасное присвоение, попробуйте создать разные сценарии.
Re: Проблем при Update зашифрованного пароля!
эмм...А когда я делаю $data->attributes = $_POST['data'];
Что-то от этого меняется? та же валидация проходит, те же проверки. Просто я сказал все аттрибуты по отдельности присвоить, а пароль перед присвоением проверить.
Что-то от этого меняется? та же валидация проходит, те же проверки. Просто я сказал все аттрибуты по отдельности присвоить, а пароль перед присвоением проверить.
Re: Проблем при Update зашифрованного пароля!
При присвоение атрибутов проверка правил не проходит.vlastachu писал(а):эмм...А когда я делаю $data->attributes = $_POST['data'];
Что-то от этого меняется? та же валидация проходит, те же проверки. Просто я сказал все аттрибуты по отдельности присвоить, а пароль перед присвоением проверить.
Re: Проблем при Update зашифрованного пароля!
Код: Выделить всё
Почему бы в условии не воспользоваться "||" ?
Так что кто то поможет создать запрос к Бд через find, чтоб исключить возврат на поле пароля, для update а там как писал выше проверку на пустоту , и всех делов.
Re: Проблем при Update зашифрованного пароля!
По моему ничего сложного тут нет, у себя делал подобным образом (предположим таблица называется User):
1. Добавляем в view
2. Дальше в контроллер (в actionUpdate)
3. Ну и в модель
1. Добавляем в view
Код: Выделить всё
echo CHtml::hiddenField('User[oldpassword]',$model->password);
Код: Выделить всё
$model->attributes=$_POST['User'];
$model->oldpassword = $_POST['User']['oldpassword'];
Код: Выделить всё
public $oldpassword;
protected function beforeSave()
{
if($this->isNewRecord || (!empty($this->oldpassword) && $this->oldpassword!=$this->password))
$this->password = md5($this->password);
return true;
}
Re: Проблем при Update зашифрованного пароля!
ну как вариант с использованием hiddenField, но у меня что то не шифрует пароль Ваш вариант при его замене, где то в CHtml::hiddenField('Manage_users[oldpassword]',$model->password); $model->password не присваеваеться oldpassword, и он пустой не дает false (!empty($this->oldpassword) && $this->oldpassword!==$this->password) в бефоре сейв
Re: Проблем при Update зашифрованного пароля!
Зачем пароль на сторону клиента посылать?