防止用户管理页面上的密码覆盖

时间:2012-11-28 19:16:57

标签: cakephp authentication

我正在为我的网站开发一些管理功能,其中具有管理员权限的用户可以打开给定用户ID的表单。从这个表单中,他们可以更改用户权限,更改用户密码或其他方式。

但是,从模型构造表单时,密码字段会从数据库中提取哈希密码并填充密码字段。因此,当管理员保存表单时,哈希密码被视为明文,因此再次进行哈希处理,覆盖原始密码。

我需要的是允许管理员用户更改表单的方法,但只有在数据库被更改的情况下才对数据库进行哈希处理和更新。

我的想法是将表单设置密码构造为空白:

查看/用户/ edit.ctp:

echo $this->Form->input('User.password',array(
        'value' => '',
        'type' => 'password',
        'autocomplete' => 'off'
    )
);

save进行某种检查以跳过密码;但这就是我被困住的地方。

控制器/ userscontroller.php

public function edit($id = null) 
{
    $this->User->id = $id;
    if ($this->request->is('get')) 
    {
        $this->request->data = $this->User->read();
    } else  {
        //Something here????
        if ($this->User->save($this->data))
        {
            $this->Session->setFlash('Your user has been updated.');
            $this->redirect(array('action' => 'index'));
        } else 
        {
            $this->Session->setFlash('Unable to update your user.');
        }
    }

    $this->set('groups',$this->User->Group->find('list'));//, array( 'fields' => array('id', 'name'))));
    $this->set('sites',$this->User->Site->find('list'));//, array( 'fields' => array('id', 'name'))));
}

如何检查并防止密码在没有变化时更新?

决定解决方案

根据提供的答案,我在同一页面上使用了第二种形式,重新使用用户经历的注册验证。更新站点/组权限时,用户通过一个表单发送,而密码通过另一个表单发送。

2 个答案:

答案 0 :(得分:1)

我会构建两个管理表单,一个用于更改权限,另一个用于更新密码。当您使用它时,更改密码表单应该有第二个字段用于验证更改。

有一些CakePHP插件可以帮助管理用户,特别是密码。

答案 1 :(得分:1)

我总是创建一个专门用于更改密码的新表单。您应该使用链接替换密码字段以更改密码。

或者,你可以禁用输入字段并需要一个按钮来点击并使用javascript删除输入元素上的disabled属性

echo $this->Form->input('User.password',array(
        'value' => '',
        'type' => 'password',
        'autocomplete' => 'off',
        'disabled' => true
    )
);

Jquery,因为它很容易

$(function(){
   $('UsersPassword').click(function(){
      $(this).attr('disabled', '0');
   });
});