繁体   English   中英

为什么 CakePHP 身份验证组件不对我的密码进行哈希处理?

[英]Why is the CakePHP authentication component not hashing my password?

我正在使用带有 Auth 和 ACL 组件的CakePHP 1.2。

在我的用户注册操作中,密码未经过哈希处理。 具体来说,这个表达式:

if ($this->data['User']['password'] !=
    $this->Auth->password($this->data['User']['confirm_password']))

即使我为passwordconfirm_password提交相同的值,这也被评估为真。 我知道密码是未散列的,因为当我删除对Auth->password的调用时,表达式的计算结果为 false。

我希望 Auth 模块自动 hash 密码。 我究竟做错了什么?

这是我的看法:

<?php
    echo $form->create('User', array('action' => 'register'));

    echo $form->input('email',
                      array('after' => $form->error(
                        'email_unique', 'This email is already registered.')));
    echo $form->input('password');
    echo $form->input('confirm_password', array('type' => 'password'));
    echo $form->end('Register');
?>

这是用户 controller 的注册操作:

function register(){
    if ($this->data) {
        if ($this->data['User']['password'] !=
            $this->Auth->password($this->data['User']['confirm_password'])) {

            $this->Session->setFlash(__('Password and Confirm Password must match.', true));
            $this->data['User']['password'] = '';
            $this->data['User']['confirm_password'] = '';
        }
        else{
            $this->User->create();
            if ($this->User->save($this->data)){
                $this->redirect(array('action' => 'index'), null, true);
            }
            else {
                $this->data['User']['password'] = '';
                $this->data['User']['confirm_password'] = '';
                $this->Session->setFlash(__('Some problem saving your information.', true));
            }
        }
    }
}

这是我的appController ,其中包含AuthAcl模块:

class AppController extends Controller {
    var $components = array('Acl', 'Auth');

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->allow('display');
            $this->Auth->fields =
              array(
                'username' => 'email',
                'password' => 'password');
            $this->Auth->authorize = 'actions';
        }
    }
}

我究竟做错了什么?

CakePHP 不会 hash 密码,除非用户名包含提交的值。 我用 email 替换用户名字段。 但是,我通过设置 Auth->fields 数组重新映射了这些字段。 但是,我是在 appController 而不是 userController 中这样做的。 所以移动这条线:

$this->Auth->fields = array('username' => 'email', 'password' => 'password');

从 appController 到 userController 解决了它。
现在问题变成了“为什么我不能重置 appController 中的 Auth-> 字段?”

您可能正在用您的UsersController::beforeFilter()覆盖AppController::beforeFilter() () 。

要“修复”它,只需将parent::beforeFilter()放在 function 的开头即可。

在保存到数据库之前,您应该使用 hash 密码。 将此 function 放入您的用户 model:

function beforeSave() {
  if(isset($this->data[$this->alias]['password']))
    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
  return true;
}

并且不要忘记将这个放在beforeFilter()中给您的用户 controller:

if(in_array($this->action, array('register'))) {
  $this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}

这意味着在注册过程中不会对密码进行哈希处理(以防注册表单验证失败)。

我想你在找

hashPasswords ($data)

看看这些页面。 他们应该为您指明正确的方向。 您也可以尝试在核心配置文件中更改调试级别。 将其从 0(生产)更改为 3 可以让您看到 sql output。 可能会有所帮助。

AuthComponent-方法

Cakephp故障排除

对不起,我无能为力,只能为您指明正确的方向。 我是 cakephp 的新手。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM