При вызове Auth.
я пытаюсь использовать модель Account
вместо стандартного пользователя Auth.
Auth основывает логин на адресе электронной почты и токена.
Когда добавляются учетные записи, они проходят через BlowfishPasswordHasher.
Я просто не могу определить, в какой момент он не может аутентифицироваться при входе в систему.
Насколько я могу судить, я ссылался на Auth
чтобы использовать Account
вместо User
, и использовать адрес электронной почты / токен вместо имени пользователя / пароля везде, где это необходимо.
Есть ли что-то очевидное, что вы можете использовать или добавить дополнительные строки отладки, которые я мог бы попробовать?
Модель счета
App::uses('AppModel', 'Model'); App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth'); class Account extends AppModel { ... public function beforeSave($options = array()) { if (isset($this->data['Account']['token'])) { $passwordHasher = new BlowfishPasswordHasher(); $this->data['Account']['token'] = $passwordHasher->hash( $this->data['Account']['token'] ); } return true; } }
Контроллер счетов
App::uses('AppController', 'Controller'); class AccountsController extends AppController { public function beforeFilter() { parent::beforeFilter(); $this->Auth->allow('add'); } public function login() { $this->layout = 'nosidemenu'; #debug($_SESSION); if ($this->request->is('post')) { if ($this->Auth->login()) { return $this->redirect($this->Auth->redirectUrl()); } $this->Flash->error(__('Invalid username or password, try again debug($this->Auth->login())')); } } }
Login.ctp
<?php echo $this->Flash->render('auth'); ?> <?php echo $this->Form->create('Account', array('action' => 'login')); ?> <?php echo $this->Form->input('email', array('class' => 'form-control', 'type' => 'text', 'placeholder' => 'Email')); ?> <?php echo $this->Form->input('token', array('class' => 'form-control', 'type' => 'password', 'placeholder' => 'Password')); ?> <?php echo $this->Form->submit('Submit', array('class' => 'btn btn-primary btn-block btn-flat')); echo $this->Form->end(); ?>
AppController
App::uses('Controller', 'Controller'); class AppController extends Controller { public $components = array( 'Session', 'Flash', 'Auth' => array('authenticate' => array('Form' => array( 'userModel' => 'Account', 'passwordHasher' => 'Blowfish', 'fields' => array( 'username' => 'email', 'password' => 'token' ) ) ), 'loginRedirect' => array( 'controller' => 'accounts', 'action' => 'index' ), 'loginAction' => array( 'controller' => 'accounts', 'action' => 'login' ), 'logoutRedirect' => array( 'controller' => 'pages', 'action' => 'index', 'home' ), 'authError' => 'You don\'t have access here.', ), ); public function beforeFilter() { $this->Auth->allow('index', 'view'); $this->Auth->authError = sprintf(__('You are not authorized to access that location %s/%s .',true),$this->name,$this->action); } }
Кроме того, у меня есть следующие строки отладки в моей функции входа:
РЕДАКТИРОВАТЬ:
Поэтому я играл с некоторыми отладочными строками, я добавил debug($this->data);
как в моем AppController beforeFilter (), так и в AccountController login (). Оба экземпляра этой строки отладки сообщают о том же массиве:
array( 'Account' => array( 'email' => 'user@test.com', 'token' => 'password' ) )
Должно ли сообщение отладки в login () выводить хешированный токен? Несмотря на то, что учетные записи добавляются в базу данных с хешированным паролем, не могли ли они хешировать при вызове через login?
Вы должны установить данные в свою модель
public function login() { $this->layout = 'nosidemenu'; #debug($_SESSION); if ($this->request->is('post')) { /* Passed the request data in $this->Auth->login() */ if ($this->Auth->login($this->request->data)) { return $this->redirect($this->Auth->redirectUrl()); } $this->Flash->error(__('Invalid username or password, try again debug($this->Auth->login())')); } }
Здесь я получил это отсюда
В 2.x $this->Auth->login($this->request->data)
будет регистрировать пользователя с любыми данными, а в 1.3 $this->Auth->login($this->data)
попытается сначала идентифицировать пользователя и войти в систему только при успешном завершении.