Неверное имя пользователя или пароль при входе в систему () с использованием BlowfishPasswordHasher в CakePHP 2.x

Я использую CakePHP 2.7.8 для создания панели администратора. Мой проект содержит несколько администраторов вместо пользователей. Вот почему у меня есть admins таблица в базе данных, а не users Таблица.

я использую BlowfishHasher для хеширования паролей, и все работает нормально. Пароли хешируются перед сохранением в базу данных.

Но login() возвращает:

Invalid username or password, try again

Администраторы таблицы:

CREATE TABLE `admins` (
  `id` char(36) NOT NULL,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `gender` varchar(45) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`))

Модель администратора: Admin.php

<?php
App::uses('AppModel', 'Model');
App::uses('BlowfishPasswordHasher','Controller/Component/Auth');
/**
 * Admin Model
 *
 */
class Admin extends AppModel {

/**
 * Display field
 *
 * @var string
 */

    public $displayField = 'first_name';


        public function beforeSave($options = array()) {
            if(isset($this->data[$this->alias]['password'])){
                $passwordHasher = new BlowfishPasswordHasher();
                $this->data[$this->alias]['password'] = $passwordHasher->hash(
                    $this->data[$this->alias]['password']
                        );
            }
            return true;
        }
}

Контроллер Администраторов: AdminsController.php

<?php
App::uses('AppController', 'Controller');
/**
 * Admins Controller
 *
 * @property Admin $Admin
 * @property PaginatorComponent $Paginator
 * @property FlashComponent $Flash
 * @property SessionComponent $Session
 */
class AdminsController extends AppController {

/**
 * Components
 *
 * @var array
 */
    public $components = array('Paginator', 'Flash', 'Session');

/**
 * index method
 *
 * @return void
 */
    public function index() {
        $this->Admin->recursive = 0;
        $this->set('admins', $this->Paginator->paginate());
    }
/**
 * login function
 */
        public function login(){
            if($this->request->is('post')) {
                if($this->Auth->login()) {
                    return $this->redirect($this->Auth->redirectUrl());
                }
                $this->Flash->error(__('Invalid username or password, try again'));
            }
        }

/**
 * logout function
 */
        public function logout(){
            return $this->redirect($this->Auth->logout());
        }
}

Контроллер приложений: AppController.php

<?php
App::uses('Controller', 'Controller');

/**
 * @package     app.Controller
 * @link        http://book.cakephp.org/2.0/en/controllers.html#the-app-controller
 */
class AppController extends Controller {

    public $components = array(
        'Flash',
        'Auth' => array(
            'loginRedirect'=>array(
                'controller'=>'admins',
                'action'=>'index'
            ),
            'logoutRedirect'=>array(
                'controller'=>'admins',
                'action'=>'login'
            ),
            'authenticate'=>array(
                'Form'=>array(
                    'passwordHasher'=>'Blowfish'
                )
            )
        )
    );

    function beforeFilter() {
        $this->Auth->authenticate = array(
            AuthComponent::ALL => array(
                'userModel' => 'Admin'
            )
        );
        $this->Auth->allow('login','add','index');
    }
}

Вид входа в систему: login.ctp

<div class="users form">
    <?php echo $this->Flash->render('auth'); ?>
    <?php echo $this->Form->create('admin'); ?>
        <fieldset>
        <legend>
            <?php echo __('Please enter your username and password'); ?>
        </legend>
        <?php 
            echo $this->Form->input('username'); 
            echo $this->Form->input('password');
        ?>
    </fieldset>
    <?php echo $this->Form->end(__('Login')); ?>
</div>

2 ответа

Решение

Попробуйте изменить свой password поле из VARCHAR(255) в BINARY(60),

Не забудьте очистить кеш моделей после этого.

Смотрите следующий вопрос для получения более подробной информации:


редактировать

Так же AuthComponent Конфигурация определена в $components массив перезаписывается в beforeFilter(),

Попробуйте заменить следующий код:

$this->Auth->authenticate = array(
    AuthComponent::ALL => array(
        'userModel' => 'Admin'
    )
);

с:

$this->Auth->authenticate[AuthComponent::ALL] = array(
    'userModel' => 'Admin'
);

Редактировать 2

По вашему мнению, вы должны заменить

<?php echo $this->Form->create('admin'); ?>

с

<?php echo $this->Form->create('Admin'); ?>

Дело важно.

Из проблемы, которую вы опубликовали, я думаю, что есть вероятность, что ваш пароль не хэшируется должным образом, когда вы входите в систему.

Попробуйте немного отладки в вашем действии входа в систему:

    public function login(){

        if($this->request->is('post')) {

            App::uses('BlowfishPasswordHasher','Controller/Component/Auth');

            $passwordHasher = new BlowfishPasswordHasher();

            $this->request->data['Admin']['password'] = $passwordHasher->hash(
                   $this->request->data['Admin']['password']
            );

            pr($this->request->data);

            exit;

            // Take a look at this $this->request->data["Admin"]["password"] field and compare it with the password you have in the database. Do they match?

            if($this->Auth->login()) {
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('Invalid username or password, try again'));
        }
    }

Мир! XD

Другие вопросы по тегам