我在使用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>
CakePHP3默认使用的是不同于2的哈希算法(bcrypt与SHA1),所以你需要把你的密码长度加长。为了安全起见,将密码字段改为VARCHAR(255)。
当CakePHP 3试图从this->Auth->identify()与数据库中的哈希密码中识别你的内存哈希密码时,由于缺少一些字符,所以永远不会匹配。改为255是超过需要的,但如果将来使用更安全的哈希,可以帮助将来证明。建议使用 255,因为字符数可以存储在一个字节中。
解决了。数据库中的类型小于要求。改为varchar(255),现在工作正常:)
我也有同样的问题。登录[ Auth->identify()]对我不起作用。改变db中的密码长度将解决这个问题。
嗨,分享我的代码段,以Login Auth,所有的测试都是OK的,在CakePHP 3.1中,海关(表+视图登录BootStrap 3+SQL基础+自定义bootstrap.php中的西班牙文Inflector::规则(******))
所有代码
我想出了一个办法,只需加入 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);
}