Неверное имя пользователя или пароль при входе в систему () с использованием 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