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

Bet*_*eto 10 php authentication cakephp login cakephp-3.0

我在使用CakePHP 2一段时间后开始使用CakePHP 3,我在创建身份验证登录时遇到了麻烦.

新的auth函数$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']);
    }
}
Run Code Online (Sandbox Code Playgroud)

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'));
        }
    }
[...]
Run Code Online (Sandbox Code Playgroud)

用户(模型实体):

<?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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<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>
Run Code Online (Sandbox Code Playgroud)

cs0*_*s01 24

CakePHP3默认使用不同的散列算法,而不是2(bcrypt与SHA1),因此您需要使密码长度更长.将您的密码字段更改为VARCHAR(255)是安全的.

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


Bet*_*eto 5

解决:数据库上的类型少于必需.更改为varchar(255),现在工作正常:)

  • 我不知道这是可能的(点击绿色v)...我更新了.谢谢你的提示=) (2认同)