0

我有一个用 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.');
    }
}

这是 beforeSave 到 UserModel 中的方法:

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

问题是当我尝试保存字段密码时返回错误是不合适的类型。如果我在保存之前打印字段密码,我会看到类似的内容:*****但如果我打印变量,则md5($user['User']['password'])返回正确的密码加密值。

谢谢

4

2 回答 2

1

IMO,没有用户编辑其个人资料信息的“密码”字段。

您可以在页面上有 2 个表单,其中第二个是更改密码表单。这样,例如,如果用户更改了他们的“名字”(第一种形式),您的代码就不必检查或使用他们的密码做任何事情。

在看到许多不同的框架并自己创建系统之后,我不能说我记得我在“狂野”中看到的任何事情,就像你所做的那样。您正在做一个额外的步骤,即获取他们的旧密码并“放回去”,这样当他们想要更改他们的个人资料详细信息时,您就不会在数据库中丢失他们的密码。

如果出于安全考虑,您可以让他们“确认”他们的密码,以便在更改个人资料详细信息之前密码必须匹配。

在“编辑配置文件”表单上有“密码”框只是糟糕的代码逻辑。

于 2013-11-11T22:24:50.333 回答
1

第一条评论,使用 md5 没有错,但我会使用 sha1。

其次,您只能使用一种形式,而不是 2。然后,在您的控制器中,您只需要检查用户是否输入了您已经在执行的新密码,如果该字段为空,则您取消设置该字段,所以 cake won' t 更新该字段。

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保留在会话中我没有在示例代码中编写它

于 2013-11-12T00:43:34.863 回答