Cakephp 3.0 Login每次都返回false

时间:2015-03-02 19:15:13

标签: php cakephp cakephp-3.0

我正在尝试在Cakephp 3.0网站上登录用户。我的表有一个'用户名'和'密码'字段,命名为。我可以添加一个用户,我的密码成功地被哈希并存储在我的表中。尽管如此,我甚至无法登录一次。

我的AppController initialize()方法:

$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. protected $ _accessible设置正确
  2. 检查表列名称是否完全是用户名和密码
  3. SQL查询返回1行,通过控制台检查,但是Auth-&gt; identify()没有返回任何内容。
  4. 如果我输入了错误的密码,没有任何运气清除
  5. ,就会有很多新用户
  6. 检查我的文件/表格/列名称以使所有内容匹配[至少我认为一切都很好]
  7. 还检查用户是否已使用登录 $ this-&gt; Auth-&gt;用户('用户名')没有返回任何内容
  8. 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 - 我尝试发送密码的哈希版本并将请求 - &gt;数据['密码']重置为哈希版本。这不起作用,因为

    1. 同一个单词的散列版本每次都不同。我使用了(新的DefaultPasswordHasher) - &gt;这个
    2. 的hash()
    3. 我尝试将密码的哈希版本直接复制到我的登录表单中。没有运气

1 个答案:

答案 0 :(得分:4)

如果您没有使用名为“Users”的表来存储用户名和密码,您需要告诉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以防万一)