我在cakephp中开发了一个坐垫,我有一个用于编辑用户的页面 我的用户表有很多字段,其中一个是md5中的密码。
用户可以修改其所有字段和密码,但如果他将此字段留空,我不会从数据库中取出旧密码并保存。
但是在保存密码字段时返回错误。
这是我对控制器的行动:
if ($this->request->is ('post')){
$this->User->id = $this->request->data['User']['id'];
if($this->request->data['User']['password'] == ''){
$user = $this->User->find('first',array('conditions'=>array('User.id' => $this->request->data['User']['id'])));
$this->request->data['User']['password'] = md5($user['User']['password']);
$this->request->data['User']['password_confirm'] = md5($user['User']['password']);
}
if ($this->User->save($this->request->data)) {
$this->redirect (array ('action'=>'index'));
}
else{
debug($this->User->validationErrors);
$this->Session->write('flash_element','error');
$this->Session->setFlash ('Errore di salvataggio dello user.');
}
}
这是之前保存到UserModel的方法:
public function beforeSave(){
if (isset($this->data['User']['password'])){
$this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
}
}
问题是当我尝试保存返回我的字段密码谎言是不合适的类型错误。
如果我在保存之前打印字段密码,我会看到类似:*****
但是如果我打印变量md5($user['User']['password'])
,则返回正确的密码加密值。
由于
答案 0 :(得分:1)
IMO,没有用户编辑其个人资料信息的“密码”字段。
页面上可以有2个表单,第二个表单是更改密码表单。这样,如果用户更改了他们的“名字”(例如,在第一种形式中),您的代码就不必检查或使用他们的密码做任何事情。
在看到许多不同的框架,并自己创建系统之后,我不能说我回想起我在“狂野”中所看到的任何事情,就像你所做的那样。您正在通过获取旧密码和“将其恢复”来执行额外步骤,以便在他们想要更改其个人资料详细信息时不会丢失数据库中的密码。
如果是为了安全起见,您可以让他们“确认”他们的密码,以便在更改个人资料详细信息之前必须匹配。
“编辑个人资料”表单上的“密码”框只是错误的代码逻辑。
答案 1 :(得分:1)
首先评论,使用md5没有错,但我会使用sha1。
其次,您只能使用一种形式,而不能使用2种形式。 然后,在您的控制器中,您只需要检查用户是否输入了您正在执行的新密码,如果该字段为空,则您取消设置该字段,因此蛋糕将不会更新该字段。
if ($this->request->is ('post')){
$this->User->id = $this->request->data['User']['id'];
if ($this->request->data['User']['password'] == '') {
unset($this->request->data['User']['password'], $this->request->data['User']['password_confirm']);
}
if ($this->User->save($this->request->data)) {
$this->redirect (array ('action'=>'index'));
}
else{
debug($this->User->validationErrors);
$this->Session->write('flash_element','error');
$this->Session->setFlash ('Errore di salvataggio dello user.');
}
}
顺便说一下,我会改变这个
$this->User->id = $this->request->data['User']['id'];
像
这样的东西$this->request->data['User']['id'] = $this->Session->read('Auth.id');
为了防止数据被篡改,但由于我不知道你是否在会话中保留用户id我没有在示例代码中写入