CakePHP 3.x从AppController以外的其他控制器启动Auth组件会产生错误结果

时间:2017-07-26 21:32:03

标签: mysql authentication cakephp-3.0

我正在登录网站的一部分。 因此,我不想在AppController中启动Auth,但在实际的Controller中我需要它。

在PremiumController中:

[...]

use Cake\Controller\Component\AuthComponent;

[...]

public function initialize()
{
    parent::initialize();

    $this->loadComponent('Auth', [
        'Basic' => ['userModel' => 'Clients'],
        'Form' => ['userModel' => 'Clients'],
        'loginAction' => [
            'controller' => 'Premium',
            'action' => 'login',
            'plugin' => false
        ],
        'authError' => 'Unauthorized Access',
        'authenticate' => [
            'Form' => [
                'fields' => [
                    'username' => 'naam',
                    'password' => 'pass'
                ],
                'userModel'=>'Clients', //Other table than Users
                'passwordHasher' => [
                    'className' => 'Premium', //use MD5
                ]
            ]
        ],
        'loginRedirect' => [
            'controller' => 'Premium',
            'action' => 'dashboard'
        ],
        'logoutRedirect' => [
            'controller' => 'Search',
            'action' => 'index'
        ]
    ]);


}

[...]  并降低登录部分

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'));
    }
}

我没有得到任何结果。 $ user仍为'false'

如何才能完成这项工作?有没有办法正确调试Auth组件?

3 个答案:

答案 0 :(得分:0)

尝试在会话中分配密钥,以便Auth检查会话中是否存在密钥。

像这样更改你的代码,

$this->loadComponent('Auth', [
    'Basic' => ['userModel' => 'Clients'],
    'Form' => ['userModel' => 'Clients'],
    'loginAction' => [
        'controller' => 'Premium',
        'action' => 'login',
        'plugin' => false
    ],
    'authError' => 'Unauthorized Access',
    'authenticate' => [
        'Form' => [
            'fields' => [
                'username' => 'naam',
                'password' => 'pass'
            ],
            'userModel'=>'Clients', //Other table than Users
            'passwordHasher' => [
                'className' => 'Premium', //use MD5
            ]
        ]
    ],
    'loginRedirect' => [
        'controller' => 'Premium',
        'action' => 'dashboard'
    ],
    'logoutRedirect' => [
        'controller' => 'Search',
        'action' => 'index'
    ]
]);
$this->Auth->__set('sessionKey', 'Auth.client');

答案 1 :(得分:0)

控制器侦听登录页面及其确切的请求名称。

我的login.ctp的内容是这个

    <?= $this->Form->input('username', ['type' => 'text', 'id' => 'username', 'label' => __('Login / E-mail'), 'placeholder' => __('Login / E-mail')]) ?>

    <?= $this->Form->input('password', ['type' => 'password', 'id' => 'password', 'label' => __('Wachtwoord'), 'placeholder' => __('Wachtwoord')]) ?>

我不得不将其改为

    <?= $this->Form->input('naam', ['type' => 'text', 'id' => 'username', 'label' => __('Login / E-mail'), 'placeholder' => __('Login / E-mail')]) ?>

    <?= $this->Form->input('pass', ['type' => 'password', 'id' => 'password', 'label' => __('Wachtwoord'), 'placeholder' => __('Wachtwoord')]) ?>

将后数据请求解析为正确的字段。 我误解的是,财务主任对此表示不满。

答案 2 :(得分:0)

这会在我搜索 cakephp 3 "sessionkey" 时显示,因此这适用于需要在 CakePHP 3 应用程序中设置自定义 sessionKey 的任何人。在您的src/Application.php中:

$service->loadAuthenticator('Authentication.Session', [
    'sessionKey' => 'MyAuthKey',
]);