登录[ Auth->identified()]在CakePHP 3上始终为false。

问题描述 投票:10回答:5

我在使用CakePHP2一段时间后开始使用CakePHP3,创建认证登录时遇到了麻烦。

新的认证功能 $this->Auth->identify() 总是返回false。

在数据库中,密码都是加密的,而且查询用户也没有问题。

我的代码。

AppController:

[...]
class AppController extends Controller{
    public function initialize(){
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'loginRedirect' => [
                'controller' => 'Admin',
                'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Pages',
                'action' => 'display'
            ]
        ]);
    }

    public function beforeFilter(Event $event)
    {
        $this->Auth->allow(['display']);
    }
}

UserController:

[...]
class UsersController extends AppController{
    public function beforeFilter(Event $event)
    {
    parent::beforeFilter($event);
    $this->Auth->allow(['logout']);
    }
[...]
    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('Invalid username or password, try again'));
        }
    }
[...]

User (Model Entity):

<?php
namespace App\Model\Entity;

use Cake\Auth\DefaultPasswordHasher;
use Cake\ORM\Entity;

class User extends Entity{
    protected $_accessible = [*];
    protected function _setPassword($password){
        return (new DefaultPasswordHasher)->hash($password);
    }
}

视图。

<div class="users form">
<?= $this->Flash->render('auth') ?>
<?= $this->Form->create() ?>
    <fieldset>
        <legend><?= __('Please enter your username and password') ?></legend>
        <?= $this->Form->input('username') ?>
        <?= $this->Form->input('password') ?>
    </fieldset>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end() ?>
</div>
php cakephp authentication login cakephp-3.0
5个回答
24
投票

CakePHP3默认使用的是不同于2的哈希算法(bcrypt与SHA1),所以你需要把你的密码长度加长。为了安全起见,将密码字段改为VARCHAR(255)。

当CakePHP 3试图从this->Auth->identify()与数据库中的哈希密码中识别你的内存哈希密码时,由于缺少一些字符,所以永远不会匹配。改为255是超过需要的,但如果将来使用更安全的哈希,可以帮助将来证明。建议使用 255,因为字符数可以存储在一个字节中。


5
投票

解决了。数据库中的类型小于要求。改为varchar(255),现在工作正常:)


1
投票

我也有同样的问题。登录[ Auth->identify()]对我不起作用。改变db中的密码长度将解决这个问题。


1
投票

嗨,分享我的代码段,以Login Auth,所有的测试都是OK的,在CakePHP 3.1中,海关(表+视图登录BootStrap 3+SQL基础+自定义bootstrap.php中的西班牙文Inflector::规则(******))

所有代码

https:/bitbucket.orgsnippetseomrLo49。


0
投票

我想出了一个办法,只需加入 use Cake\Auth\DefaultPasswordHasher; 及其下面的覆盖方法 _setPassword.

以下是修改后的内容。

Modeltable.php

<?php

use Cake\Auth\DefaultPasswordHasher;

// Somewhere in the class
protected function _setPassword($password) {
    return (new DefaultPasswordHasher)->hash($password);
}
© www.soinside.com 2019 - 2024. All rights reserved.