Cake php 登录显示用户名和密码无效,即使它们是正确的

问题描述 投票:0回答:3

我正在尝试将 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),这就是我的情况,所以不应该是这样。

提前致谢

php mysql forms cakephp authentication
3个回答
1
投票

所以我的密码太小了,根据 ndm 默认密码哈希器需要 varchar(60) 的有用答案,我读到的有关 varchar(50) 的内容可能适用于我不使用的河豚。

轻松更改 varcahr 限制的语法是: ALTER TABLE users CHANGE 密码 密码 VARCHAR(255);

编辑:我无法将自己的答案标记为已解决,但问题已解决。


0
投票

这可能不会立即起作用,但是表单是否已发布? 您需要开始调试,将您的功能更改为此,以检查:

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.'));
    }

0
投票

我的观察:如果应用程序将您重定向到登录页面,则登录会成功,否则,如果您通过单击登录按钮或输入 URL 访问登录页面,则会失败。

© www.soinside.com 2019 - 2024. All rights reserved.