2015-04-09 2 views
9

Я начал использовать CakePHP 3 через некоторое время с помощью CakePHP 2, и у меня возникли проблемы с созданием входа для аутентификации.Вход [Auth-> ident()] всегда false на CakePHP 3

Новая функция auth $this->Auth->identify() всегда возвращает false.

В базе данных пароль зашифрован отлично, а запрос, который берет пользователя, тоже в порядке.

Мой код:

AppController:

[...] 
class AppController extends Controller{ 
    public function initialize(){ 
     $this->loadComponent('Flash'); 
     $this->loadComponent('Auth', [ 
      'loginRedirect' => [ 
       'controller' => 'Admin', 
       'action' => 'index' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Pages', 
       'action' => 'display' 
      ] 
     ]); 
    } 

    public function beforeFilter(Event $event) 
    { 
     $this->Auth->allow(['display']); 
    } 
} 

UserController:

[...] 
class UsersController extends AppController{ 
    public function beforeFilter(Event $event) 
    { 
    parent::beforeFilter($event); 
    $this->Auth->allow(['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')); 
     } 
    } 
[...] 

пользователя (модель Entity):

<?php 
namespace App\Model\Entity; 

use Cake\Auth\DefaultPasswordHasher; 
use Cake\ORM\Entity; 

class User extends Entity{ 
    protected $_accessible = [*]; 
    protected function _setPassword($password){ 
     return (new DefaultPasswordHasher)->hash($password); 
    } 
} 

Вид:

<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> 
+0

Что длина вашего поля ввода пароля? – ADmad

+0

Это VARCHAR (255) – Beto

+3

Был 45 .... Изменен до 255 и теперь работает =) Спасибо = D – Beto

ответ

22

CakePHP3 использует другой алгоритм хэширования по умолчанию, чем 2 (bcrypt против SHA1), поэтому вам нужно увеличить длину пароля. Измените свое поле пароля на VARCHAR (255), чтобы быть в безопасности.

Когда CakePHP 3 пытается идентифицировать ваш хешированный пароль в памяти из этого-> Auth-> ident() по сравнению с хэшированным паролем в базе данных, он никогда не будет соответствовать, поскольку некоторые символы отсутствуют. Переход на 255 больше, чем необходимо, но может помочь в будущем, если в будущем будет использоваться еще более безопасный хеш. 255 рекомендуется, так как количество символов может храниться в одном байте.

5

Решено: тип базы данных был меньше, чем требуется. Изменен на varchar (255) и теперь отлично работает :)

+2

Почему бы вам не пометить ответ cs01 как принятый? Это то, что он сказал ... – Albert

+2

Я не знал, что это было возможно (щелкнув по зеленому v) ... Я обновил. Спасибо за подсказку =) – Beto

+0

ПРОВЕРЬТЕ ЭТО! Это также было проблемой для меня, после упрямства и не проверяя. – mewc

1

У меня была такая же проблема. Login [Auth-> ident()] не работал для меня. Изменение длины пароля в db решит проблему.

+0

уже изменяют длину, но не имеют никаких результатов. Может попасть в -> is ('post') – aswzen

1

Приветствую мои фрагменты для входа в систему Auth, все Тестирование в порядке, в CakePHP 3.1, таможня (Таблица + просмотр входа в систему BootStrap 3 + база SQL + пользовательский bootstrap.php для испанского в Inflector :: rules (*****) **))

Весь код в

https://bitbucket.org/snippets/eom/rLo49

Смежные вопросы