ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何配置CakePHP的$this-> Auth-> login()以使用自定义密码hasher

2019-05-29 03:16:44  阅读:241  来源: 互联网

标签:php authentication cakephp cakephp-2-0 cakephp-2-3


CakePHP v.2.4 ……

我正在关注this documentation尝试设置Auth组件以使用我的自定义密码哈希类:

App::uses('PHPassPasswordHasher', 'Controller/Component/Auth');

class AppController extends Controller {

    // auth needed stuff
    public $components = array(
        'Session',
        'Cookie',
        'Auth'      => array(
            'authenticate'      => array(
                'Form'  => array(
                    'fields' => array('username'=>'email', 'password'=>'password'),
                    'passwordHasher'    => 'PHPass' 

                )
            ),

在我的UsersController :: login()里面我调试了$this-> Auth-> login();并且它总是返回false,即使我提交了正确的电子邮件/密码.

(注意:对我来说看起来很奇怪,login()没有参数,但是文档似乎暗示它会自动查看请求数据.如果我的配置没有正确地检查它,这将是有意义的. User.email字段代替用户名.)

提交的登录表单中的帖子数据如下所示:

array(
    'User' => array(
        'password' => '*****',
        'email' => 'whatever@example.com'
    )
)

我错过了什么?

UPDATE2

我开始怀疑使用默认的哈希算法而不是我的自定义类.我试图匹配文档中的示例,但他们对如何执行此操作非常模糊.

这是app / Controller / Component / Auth / PHPassPasswordHasher.php的内容

<?php
App::import('Vendor', 'PHPass/class-phpass'); //<--this exists and defines PasswordHash class
class PHPassPasswordHasher extends AbstractPasswordHasher {

    public function hash($password) {
        $hasher = new new PasswordHash( 8, true );
        return $hasher->HashPassword($password);
    }

    public function check($password, $hashedPassword) {
        debug('PHPassHasher'); die('Using custom hasher'); //<--THIS NEVER HAPPENS!
        $hasher = new new PasswordHash( 8, true );
        return $hasher->CheckPassword($password, $hashedPassword);
    }

}

AHA! debug()永远不会出现……所以我很确定问题出在我的自定义hasher配置上.

UPDATE3

补充线索:我通过设置各种默认哈希算法(例如:“简单”,“Blowfish”)和创建用户进行了实验.显示在数据库中的哈希值都是相同的,它告诉我完全忽略了我的配置设置.

UPDATE4

我在/lib/Cake/Controller/Component/Auth/BaseAuthenticate.php的构造函数中调试了$this->设置,我的自定义哈希设置在那里:

array(
    'fields' => array(
        'password' => 'password',
        'username' => 'email'
    ),
    'userModel' => 'User',
    'scope' => array(),
    'recursive' => (int) 0,
    'contain' => null,
    'passwordHasher' => 'PHPass'
)

解决方法:

您需要将密码hasher类重命名为具有后缀“PasswordHasher”,并且仅在’className’参数中提供非后缀名称.

例如:

<?php
App::import('Vendor', 'PHPass/class-phpass'); //<--this exists and defines PasswordHash class
class PHPassHasherPasswordHasher extends AbstractPasswordHasher {

    // functions

}

docs中的示例将classname设置为’Simple’,然后加载’SimplePasswordHasher’.

你可能会发现拥有PHPassHasherPasswordHasher的名字有点傻,这取决于你想要的它.也许PHPassPasswordHasher可能更合适(然后使用classname参数’PHPass’).

编辑:当一个接一个地使用多个大写字母(例如PHPass)时,似乎Cake有问题,所以正确的方法是将密码hasher类更改为以下内容:

<?php
App::import('Vendor', 'PHPass/class-phpass'); //<--this exists and defines PasswordHash class
class PhpassPasswordHasher extends AbstractPasswordHasher {

    // functions

}

…并确保文件名与类名匹配:PhpassPasswordHasher.php.

感谢SDP的讨论,我今天学到了一些东西!

标签:php,authentication,cakephp,cakephp-2-0,cakephp-2-3
来源: https://codeday.me/bug/20190529/1175662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有