cakephp 2.5.7登录->;即使密码正确,Auth始终为false

cakephp 2.5.7登录->;即使密码正确,Auth始终为false,cakephp,authentication,Cakephp,Authentication,我被这个问题困扰了将近一个星期。即使浏览互联网上的所有解决方案也不能帮助我解决问题。所以我决定在这里问我的问题,希望我能找到解决办法 我的问题是为什么即使我的密码是正确的,我也总是得到AuthFALSE?我设法添加了一个新用户,它存储了加密的密码,但当我尝试使用该用户名和`密码登录时,它会显示“无效用户名或密码,请重试” 提前感谢我在这部分蛋糕上也遇到了一些麻烦,下面是我最终使用的方法,它对我很有用 public function login() { if ($this->req

我被这个问题困扰了将近一个星期。即使浏览互联网上的所有解决方案也不能帮助我解决问题。所以我决定在这里问我的问题,希望我能找到解决办法

我的问题是为什么即使我的密码是正确的,我也总是得到Auth
FALSE
?我设法添加了一个新用户,它存储了加密的密码,但当我尝试使用该
用户名和`密码登录时,它会显示“无效用户名或密码,请重试


提前感谢

我在这部分蛋糕上也遇到了一些麻烦,下面是我最终使用的方法,它对我很有用

public function login() {
    if ($this->request->is('post')) {
        $options = array(
            'conditions' => array(
                'User.username' => $this->request->data['User']['username'],
                'User.password' => Security::hash($this->request->data['User']['password'], 'sha256', true)
            ),
            'fields' => array(
                'User.id',
                'User.username',
                'User.group_id',
                // other fields you need
            )
        );

        $userData = $this->User->find('first', $options);
        if (!empty($userData) && $this->Auth->login($userData['User'])) {
            $this->redirect($this->Auth->redirectUrl());
        } else {
            $this->Session->setFlash(__('Username, and/or password are incorrect'));
        }
    }
}

因此,底线是手动检查具有给定用户名和密码的用户是否存在,然后登录。顺便说一句,请注意,对于
login()
函数,我正在传递这样一个数组

array(
    'id' => 1,
    'email' => 'test@gmail.com',
    'group_id' => 2 
);
而不是

    array(
        'User' => array(
            'id' => 1,
            'email' => 'test@gmail.com',
            'group_id' => 2 
        ) 
    );
此外,如果您使用的是cake docs中的cake 2.x,则不希望将密码传递给
登录
函数

在2.x中,$this->Auth->login($this->request->data)将让用户登录 无论发布什么数据,而在1.3中 $this->Auth->login($this->data)将首先尝试识别用户 并仅在成功时登录

因此,首先不需要传递密码,但在使用
登录
之前,您应该仔细检查有效的用户密码,因为如果如上所述,cake将使用任何数据登录用户

关于密码散列部分,请确保您使用的散列算法与注册期间使用的完全相同的salt(如果您使用并且应该使用的话)

编辑:

尝试在模型的beforeSave中使用此选项

public function beforeSave($options = array()) {
    parent::beforeSave($options);

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

最后,最好是为每个用户保存一个唯一的salt(salt应与用户密码一起保存在db中)。在cake中,所有密码只使用一个应用程序端salt,如果db和应用程序受损,攻击者可以为所有密码生成一个自定义彩虹表,但如果salt对每个用户都是唯一的,那么坏人应该分别为每个用户创建自定义彩虹表,这比工作/时间/金钱多得多。

谢谢您的回答@dav。。顺便说一句,这是工作,如果我没有散列密码。但是如果对密码使用哈希,则密码不匹配(当我尝试登录时)。SQL语句显示数据库中存储的密码之间的差异。因此,我建议散列算法不一样。。但我使用了相同的哈希算法,即sha256。。请您再次帮助我找出散列部分中我的模型和控制器的区别在哪里?。。我更新了UserController-->“因此,底线是手动检查具有给定用户名和密码的用户是否存在”以及您这样做的方式,您将完全失去使用身份验证适配器的能力。@如果请查看更新的答案,如果这不起作用,请检查您的视图file@burzum,谢谢你的评论,请你详细说明一下这样做的具体错误是什么?我也非常反对这种做法。它破坏了使用干净安全的身份验证适配器的整个想法。请使用有文档记录的适配器,因为如果您做得正确,它们100%工作(这并不太难做到)。