我正在尝试将 Cake php 博客教程中的登录系统实现到我自己的系统中,但似乎无法使其正常工作。所有登录尝试都会遇到我在 UserController->login() 中设置的错误。
这是我的一些代码,如果需要我可以发布更多。
UsersController.php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
class UsersController extends AppController
{
public function beforeFilter(Event $event)
{
parent::beforeFilter($event);
$this->Auth->allow(['add','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.'));
}
}
AppController.php
class AppController extends Controller
{
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler');
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'username',
'password' => 'password'
]
]
],
'loginRedirect' => [
'controller' => 'Projects',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
]
]);
}
public function beforeFilter(Event $event)
{
$this->Auth->allow(['index', 'view', 'edit', 'display']);
}
}
登录.ctp
<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
class User extends Entity
{
protected $_accessible = [
'*' => true,
'id' => false,
];
protected function _setPassword($password)
{
return (new DefaultPasswordHasher)->hash($password);
}
}
用户表.php
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('username');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Projects', [
'foreignKey' => 'user_id'
]);
$this->hasMany('TicketsComments', [
'foreignKey' => 'user_id'
]);
$this->belongsToMany('Projects', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'project_id',
'joinTable' => 'projects_users'
]);
$this->belongsToMany('Tickets', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'ticket_id',
'joinTable' => 'tickets_users'
]);
}
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
$validator
->requirePresence('username', 'create')
->notEmpty('username', 'A username is reuired.')
->add('username', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
$validator
->email('email')
->requirePresence('email', 'create')
->notEmpty('email')
->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
$validator
->requirePresence('password', 'create')
->notEmpty('password', 'A password is required.');
$validator
->notEmpty('role', 'A role is required.')
->add('role', 'inList', [
'rule' => ['inList',['Admin', 'User']],
'message' => 'Please enter a valid role.'
]);
return $validator;
}
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['username']));
$rules->add($rules->isUnique(['email']));
return $rules;
}
}
我对自己做错了什么感到非常困惑。我可以在数据库中确认密码实际上是散列的。我还在某处读到,数据库中的密码应该是 VARCHAR(50),这就是我的情况,所以不应该是这样。
提前致谢
所以我的密码太小了,根据 ndm 默认密码哈希器需要 varchar(60) 的有用答案,我读到的有关 varchar(50) 的内容可能适用于我不使用的河豚。
轻松更改 varcahr 限制的语法是: ALTER TABLE users CHANGE 密码 密码 VARCHAR(255);
编辑:我无法将自己的答案标记为已解决,但问题已解决。
这可能不会立即起作用,但是表单是否已发布? 您需要开始调试,将您的功能更改为此,以检查:
public function login()
{
if($this->request->is('post')){
echo "YES, we have posted information!<br />"; var_dump($this->request);
$user = $this->Auth->identify();
echo "<br /><br />Let's have a look at $user = $this->Auth->identify();"; var_dump($this->request);
if($user){
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
}
$this->Flash->error(__('Invalid username or password, try again.'));
}
我的观察:如果应用程序将您重定向到登录页面,则登录会成功,否则,如果您通过单击登录按钮或输入 URL 访问登录页面,则会失败。