【问题标题】:Cakephp 3 Digest authenticationCakephp 3 摘要认证
【发布时间】:2017-06-26 19:20:00
【问题描述】:

我尝试使用 cakephp 3 的摘要认证来构建一个可扩展的系统。仅在需要时要求客户端输入密码,但输入的详细信息不允许访问,而是再次弹出请求凭据的对话框。非常感谢任何建议或帮助!

AppController::initialize()

$this->loadComponent('Auth', [
        'authenticate' => [
            'Digest' => [
                'fields' => ['username' => 'username', 'password' => 'password_hash'],
                'userModel' => 'Users',
                'finder' => 'auth'
            ],
        ],
        'authError' => 'incorrect username or password',
        'storage' => 'Memory',
        'unauthorizedRedirect' => false
    ]);

用户表:

    public function beforeSave(\Cake\Event\Event $event)
{
    $entity = $event->data['entity'];

    // Make a password for digest auth.
    $entity->password_hash = DigestAuthenticate::password(
        $entity->username, 
        $entity->plain_password,
        env('SERVER_NAME')
    );

    $entity->created = Time::now();
    return true;
}

public function findAuth(\Cake\ORM\Query $query, array $options)
{
    $query
        ->select(['id', 'username', 'password_hash']);
    return $query;
}

编辑:从实体中删除代码

我决定深入研究摘要 getuser 函数 (Function code) 并将一些数据输出到我未经授权的页面中,以便查看发生了什么。

$Password: 8a3575d301f04f08dd461f93e3d55a21 
$digest[username]: James  
$digest['response']: 4fa261678c753da8e78e4bf98057fd72 
$hash: a627c3e68061937e454c321d55e986d3
$request->env('ORIGINAL_REQUEST_METHOD'): GET

【问题讨论】:

    标签: authentication cakephp cakephp-3.0 stateless digest-authentication


    【解决方案1】:

    只需从实体中删除 _setPassword 函数。密码将被散列,稍后此散列将用于 DigestAuthentication,而不是所需的明文。

    我还会重构并从 beforeSave 中删除密码创建,并将其放入类似于您现在使用 passwordHasher 所做的实体... 请记住,在这种情况下,您需要更新 _setUsername _setPassword 的摘要!

    【讨论】:

    • 我只是在考虑如何从 setUsername 执行此操作,因为我不知道更改摘要值所需的密码!
    • 我刚刚清除了我的数据库并再次对其进行了测试,遗憾的是它仍然无法正常工作。我能够始终如一地在数据库中获得相同的哈希值,但是当提供正确的凭据时,身份验证似乎没有获得匹配的哈希值。有什么想法吗?
    【解决方案2】:

    好吧,事实证明我犯了一个非常愚蠢的错误! 变化:

    $entity->password_hash = DigestAuthenticate::password(
        $entity->username, 
        $entity->password_hash, // was plain_password which was not in my model!
        env('SERVER_NAME')
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      相关资源
      最近更新 更多