作为标题,无论如何我在CakePHP的Controller中使用BlowFishPasswordHasher而不是Model(我只是使用saveField来保存用户的新密码)?
答案 0 :(得分:0)
您应该在模型中处理更改密码,因为很可能您也使用beforeSave()来修改密码;
通过自定义验证执行此操作将是最好的方法,因为您可以使用正确的流来检查旧密码是否与用户提供的密码匹配。如果是,则返回true,允许使用beforeSave()对新密码进行哈希处理。
例如:
模型beforeSave()
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password']) && !empty($this->data[$this->alias]['password']) && strlen($this->data[$this->alias]['password']) > 0) {
$passwordhash = new BlowfishPasswordHasher();
$this->data[$this->alias]['password'] = $passwordhash->hash($this->data[$this->alias]['password']);
}
return parent::beforeSave();
}
使用自定义验证方法,如:
自定义验证
public function oldPassword($password) {
$user = $this->find('first', array('conditions' => array('username' => $this->data[$this->alias]['username'])));
$passwordhash = Security::hash($password['oldPassword'], 'blowfish', $user[$this->alias]['password']);
if ($passwordhash === $user[$this->alias]['password']) {
return true;
} else {
return false;
}
}
使用上面的内容,您可以在允许表单提交之前使用CakePHP验证来检查旧密码。如果旧密码与DB中的旧密码匹配,则返回true以允许表单保存,并调用beforeSave来哈希新密码。
答案 1 :(得分:0)
这里使用$ _POST来获取字段
public function changepassword() {
if ($this->request->is('post') )
{
$pass_stored=0;
$current_pass= $_POST['new_password'];
$passwordHasher = new BlowfishPasswordHasher();
$newHash = $passwordHasher->hash($current_pass);
$uid= $_POST['uid'];
$this->User->query("UPDATE users SET password = '".$newHash."' WHERE id = '".$uid."' ");
$this->Session->setFlash(__('Password Saved Sucessfully'), 'success');
$this->redirect(array('action' => 'login'));
}
else
{
$this->set('resettoken', $_REQUEST['id']);
}
}