Логин Cakephp 3.0 каждый раз возвращает false

Я пытаюсь войти в систему на моем сайте Cakephp 3.0. В моей таблице есть поля «имя пользователя» и «пароль», названные как есть. Я могу добавить пользователя, и мой пароль успешно хешируется и сохраняется в моей таблице. Несмотря на это, я не могу войти ни разу.

Мой метод инициализации AppController():

$this->loadComponent('Auth',['loginAction' => [
                            'controller' => 'ShopOwners',
                            'action' => 'login'
                         ],'authenticate' => [
                              'Form' => [
                                'fields' => [
                                  'username' => 'username',
                                  'password' => 'password',
                                 ],
                                 'userModel' => 'ShopOwners'
                               ]
                         ],'loginRedirect' => [
                             'controller' => 'ShopOwners',
                             'action' => 'view'
                         ],
                    ]);
$this->Auth->allow(['home','add']);

Моя функция просмотра входа в мой контроллер

public function login(){
    $this->log('Inside login','debug');
    if($this->request->is('post')){
       $this->log('Inside login is post','debug');
       $shopOwner = $this->Auth->identify();
       if($shopOwner){
          $this->log('Inside is owner','debug');
          $this->Auth->setUser($shopOwner);
          return $this->redirect($this->Auth->redirectUrl());
       }
      $this->Flash->error(__('Invalid username or password, try again'));
    }
}

И, наконец, мой файл просмотра входа в систему login.ctp

<h1>Login</h1>
<?= $this->Form->create(); ?>
<?= $this->Form->input('username'); ?>
<?= $this->Form->input('password'); ?>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end(); ?>

Я пробовал множество решений, предлагаемых на сайте и в других местах, чтобы попытаться исправить это. К ним относятся:

  1. защищенный $_accessible установлен правильно
  2. Проверено, что имена столбцов таблицы точно совпадают с именем пользователя и паролем.
  3. SQL-запрос возвращает 1 строку, проверенную через консоль, но Auth->identify() ничего не возвращает.
  4. Сделано много новых пользователей на случай, если я ввел неправильный пароль, не повезло, ничего не очистилось
  5. Проверил имена моих файлов/таблиц/столбцов, чтобы все совпало [по крайней мере, я думаю, что все в порядке]
  6. Также проверяется, не вошел ли пользователь в систему, используя $this->Auth->user('username'), который ничего не вернул

Новичок в Cakephp и застрял на этом уже целый день. Очень ценю любую помощь.

РЕДАКТИРОВАТЬ: Может ли кто-нибудь хотя бы сказать мне, почему идентификация () ничего не возвращает. Я сделал трассировку в моей функции входа в контроллер, и она вернулась

App\Controller\ShopOwnersController::login() - 
 APP/Controller\ShopOwnersController.php, line 132
Cake\Controller\Controller::invokeAction() - 
 CORE\src\Controller\Controller.php, line 405
Cake\Routing\Dispatcher::_invoke() - 
 CORE\src\Routing\Dispatcher.php, line 114
Cake\Routing\Dispatcher::dispatch() - 
  CORE\src\Routing\Dispatcher.php, line 87
[main] - ROOT\webroot\index.php, line 37

Заканчивается на:

Undefined variable: _SESSION [CORE\src\Network\Session.php, line 436]

Почему он останавливается на index.php? Что может быть не так? В индексе я проверил

print_r(Request::createFromGlobals());

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

РЕДАКТИРОВАТЬ 2: Мой объект запроса содержит следующее

[params] => Array ( [plugin] => [controller] => [action] => [_ext] => [pass] => Array ( ) ) 
[data] => Array ( [username] => user9 [password] => user9 ) 
[query] => Array ( )

Почему мой массив запросов пуст? Это должно быть??

РЕДАКТИРОВАТЬ 3. Я попытался отправить хешированную версию своего пароля и сбросить запрос-> данные ['пароль'] на хешированную версию. Это не сработало, потому что

  1. Хэшированные версии одного и того же слова каждый раз были разными. Я использовал (новый DefaultPasswordHasher)->hash() для этого
  2. Я попытался скопировать хешированную версию пароля из базы данных прямо в форму входа. Не повезло

person KVNam    schedule 02.03.2015    source источник
comment
Добавил мою трассировку выше   -  person KVNam    schedule 03.03.2015
comment
Каков размер столбца пароля в вашей базе данных?   -  person José Lorenzo Rodríguez    schedule 03.03.2015
comment
Это очень неловко, я увидел решение по увеличению размера столбца пароля в Github, предложенное вами, а затем случайно увеличил размер имени пользователя и свел себя с ума. Большое спасибо. Теперь я увеличил размер пароля до 255, и это работает. :/ Ничего, если я отмечу ваш комментарий как правильный ответ?   -  person KVNam    schedule 03.03.2015
comment
Я отредактирую свой ответ, чтобы отразить мой комментарий   -  person José Lorenzo Rodríguez    schedule 03.03.2015
comment
Еще раз спасибо. Ответ выбран.   -  person KVNam    schedule 04.03.2015
comment
возможный дубликат Login [ Auth-›identify() ] всегда false на CakePHP 3 (решено)   -  person cs01    schedule 05.05.2015


Ответы (1)


Если вы не используете таблицу «Пользователи» для хранения имени пользователя и пароля, вам необходимо сообщить об этом CakePHP, как описано в этом разделе руководства:

http://book.cakephp.org/3.0/en/controllers/components/authentication.html#configuring-authentication-handlers

В основном вам нужно добавить это в конфигурацию AuthComponent:

$this->loadComponent('Auth',['loginAction' => [
                        'controller' => 'ShopOwners',
                        'action' => 'login'
                     ],'authenticate' => [
                          'Form' => [
                            'userModel' => 'ShopOwners', // Added This
                            'fields' => [
                              'username' => 'username',
                              'password' => 'password',
                             ]
                           ]
                     ],'loginRedirect' => [
                         'controller' => 'ShopOwners',
                         'action' => 'view'
                     ],
                ]);

Важно помнить, что хэши паролей обычно очень длинные, поэтому убедитесь, что ваш столбец паролей в базе данных достаточно велик (на всякий случай я использую 255).

person José Lorenzo Rodríguez    schedule 03.03.2015
comment
Спасибо, Лоренцо, но я уже пробовал это. В настоящее время моя форма указывает userModel как ShopOwners. До сих пор не работает. Обновил мой вопрос еще несколькими шагами, которые я попробовал. - person KVNam; 03.03.2015
comment
Для тех, кто обновляется с CakePHP 2.x, вы привыкли иметь хешированные пароли длиной 40 символов, поэтому у вас может возникнуть соблазн ограничить поле пароля до VARCHAR(40). CakePHP 3.0 хеширует VARCHAR(60), поэтому убедитесь, что вы правильно настроили таблицу БД. - person khany; 24.08.2015
comment
Спасибо @josé-lorenzo! поле пароля по ошибке было длиной 25 символов, я изменил его размер до 64 символов, а пароль - 60 символов... - person Sagar Guhe; 02.06.2016
comment
не работает... все перепробовал... боже мой cakephp 3 почему ты такой странный - person aswzen; 25.02.2018