2013-10-14 4 views
0

В настоящее время я работаю с CakePHP, если мои пользователи забыли свой пароль, я хочу, чтобы они его сбросили. (то есть я отправляю им письмо с их новым временным паролем).Сбросить пароль функции CakePHP

Но есть проблема. Пароли, хранящиеся в моей базе данных, хэшируются компонентом Auth, что означает, что если я попытаюсь выбрать все из моей модели User, я получу хешированную версию пароля. Еще больше я не знаю, как я смогу сохранить пароль HASHED после создания нового.

Я искал ответ на этот вопрос, но не мог найти примеров того, как это будет сделано.

Кто-нибудь пробовал что-то подобное или знал, как я могу быть сделан?

+0

ли вы [это] (http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/) прибегая к помощи для предмета? – mark

+0

Я думаю, что им не хватает проблемы. Лично я бы посоветовал не отправлять временный пароль, поскольку он победит цель хэширования. Но если вы должны создать временный пароль, сгенерируйте его, отправьте его, хеш его, сохраните? –

+0

В настоящее время у меня есть это в моей модели пользователя: public function beforeSave ($ options = array()) { $ this-> data ['User'] ['password'] = AuthComponent :: password ($ this- > данные [ 'User'] [ 'пароль']); return true; } Означает ли это, что все, что приходит с полем пароля, будет хэшироваться? – Marc

ответ

1

Хорошо, 2.x определенно дает больше контроля. Я только хэширования паролей в методе BeforeSave моей модели пользователя точно так же как вы делаете:

public function beforeSave() { 
    if (isset($this->data['User']['password'])) { 
     $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); 
    } 
    return true; 
} 

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

Как правило, я всегда добавляю в поле пароля неуправляемое поле в действиях контроллера, которое сохранит запись пользователя, чтобы убедиться, что она не будет перезаписана. Второй вариант заключается в том, чтобы добавить обратный вызов afterFind к вашей модели пользователя, который отключает каждый раз при загрузке модели пользователя.

О единовременном сбросе ключа .... У меня есть дополнительное поле в объекте User, которое я использую в двух случаях. Проверка электронной почты и сброс пароля. Когда пользователь создан, он устанавливается на SHA1 (+ +). Ссылка отправляется по электронной почте пользователю, который отправляет их действию проверки правителя пользователя. После проверки этого ключа этот столбец очищается в базе данных.

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

Самая большая проблема с отправкой временных паролей заключается в том, что она создает механизм DoS (против пользователей, а не вашего сайта). Если я решил преследовать кого-то, я мог бы создать задачу, которая будет каждый день перезагружать свой пароль. Они не могут войти, пока не проведут проверку своей электронной почты, но потом это снова изменится. Используя ключ, они получат электронное письмо со ссылкой на сброс, но их текущий пароль по-прежнему будет работать, поскольку наличие кода сброса не позволит им войти в систему.

0

Я думаю, вы не можете преобразовать пароль шифрования для расшифровки. Итак, если вы хотите узнать, как вы можете сбросить пароль, тогда запустите CakeDC-плагин cakephp.

https://github.com/CakeDC/users

это стандартный плагин из CakePHP.

0

попробовать это

function admin_reset($token = null) { 

     /** 
     * if logged in, send to home/dashboard page 
     */ 
     if (count($this->Session->read("Auth.User"))) { 
      return $this->redirect('/'); 
     } 

     $this->set('title_for_layout', 'Reset Password'); 

     $this->layout = 'admin'; 
     $this->User->recursive = -1; 
     if (!empty($token)) { 
      $u = $this->User->findBytokenhash($token); 
      if ($u) { 
       $this->User->id = $u['User']['id']; 
       if (!empty($this->data)) { 
        $this->User->data = $this->data; 
        $this->User->data['User']['username'] = $u['User']['username']; 
        $new_hash = sha1($u['User']['username'] . rand(0, 100)); //created token 
        $this->User->data['User']['tokenhash'] = $new_hash; 


        if ($this->User->save($this->User->data, false)) { 
         $this->Session->setFlash(__('Password has been updated.'), 'default', array('class' => 'alert alert-success')); 
         $this->redirect(array('controller' => 'users', 'action' => 'login')); 
        } 
       } 
      } else { 
       $this->Session->setFlash(__('Token corrupted. Reset link work only for once, please try again.'), 'default', array('class' => 'alert alert-success')); 
      } 
     } else { 
      //$this->redirect('/'); 
     } 
    } 
Смежные вопросы