我正在尝试将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']);
}
}
login.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>
user.php的
class User extends Entity
{
protected $_accessible = [
'*' => true,
'id' => false,
];
protected function _setPassword($password)
{
return (new DefaultPasswordHasher)->hash($password);
}
}
UsersTable.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),这就是我的情况,所以不应该这样。
提前致谢
答案 0 :(得分:0)
这可能不会立即起作用,但是表格是POST? 您需要开始调试,将功能更改为此,以检查:
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.'));
}
答案 1 :(得分:0)
所以我的密码太小,根据ndm默认密码hasher需要varchar(60)的有用答案,我读过的关于varchar(50)的东西本来可以用于我不使用的河豚。
轻松更改varcahr限制的语法是:ALTER TABLE users CHANGE password password VARCHAR(255);
编辑:我无法将自己的答案标记为已解决,但问题已解决。