CakePHP3.x:需要身份验证弹出窗口

时间:2016-03-22 13:24:52

标签: cakephp-3.x

有时,也许当我长时间没有动作或者我尝试直接访问特定页面时,会显示“需要身份验证”弹出窗口,询问我的登录名和密码。

但即使我填写了必填字段,验证也没有完成,刷新只显示“未经授权。

这个弹出窗口似乎没有调用我的登录方法。

您能告诉我凭据应该如何传输到我的用户登录控制器吗?

此致

编辑我的登录表单

<div class="container-fluid">
    <br/>
    <div class="container-fluid col-md-4 col-md-offset-4">
    <h1>Se connecter</h1>

        <div class="row">
            <div class="col-md-12">
                <?= $this->FormB->create(); ?>
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h2><?= __("Saisissez vos identifiants") ?></h2>
                        </div>
                        <div class="panel-body">

                            <?= $this->FormB->input('username', ['label' => __("Nom d'utilisateur :"), 'placeholder' => __("Nom d'utilisateur")]); ?>

                            <?= $this->FormB->input('password', ['label' => __("Mot de passe :"), 'placeholder' => __("Mot de passe")]); ?>

                            <p><em><?= $this->Html->link(__("Mot de passe oublié ?"), ['action' => 'forgotPassword']); ?></em></p>

                            <br/>

                            <?php if ($activeLink == 1): ?>

                            <p><em><?= $this->Html->link(__("Renvoyer l'email d'activation ?"), ['controller' => 'Users', 'action' => 'resend', 'username' => $username]); ?></em></p>

                            <br/>

                            <?php endif ?>              
                        </div>
                    </div>
                    <div>
                        <?= $this->Form->button(isset($btnlabel) ? __("$btnlabel") : __("Enregistrer"), ["class" => "btn btn-primary btn-block"]) ?>
                    </div>
                <?= $this->FormB->end() ?>          
            </div>
        </div>
    </div>
</div>

**编辑**当我在浏览器打开的弹出窗口中输入我的登录名/密码时,Cake会生成以下错误

2016-03-24 16:53:11 Error: [Cake\Network\Exception\UnauthorizedException] Unauthorized
Request URL: /pros/Owners/account
Stack Trace:
#0 /home/MyApp/vendor/cakephp/cakephp/src/Controller/Component/AuthComponent.php(359): Cake\Auth\BasicAuthenticate->unauthenticated(Object(Cake\Network\Request), Object(Cake\Network\Response))
#1 /home/MyApp/vendor/cakephp/cakephp/src/Controller/Component/AuthComponent.php(296): Cake\Controller\Component\AuthComponent->_unauthenticated(Object(App\Controller\Pros\OwnersController))
#2 /home/MyApp/vendor/cakephp/cakephp/src/Controller/Component/AuthComponent.php(258): Cake\Controller\Component\AuthComponent->authCheck(Object(Cake\Event\Event))
#3 /home/MyApp/vendor/cakephp/cakephp/src/Event/EventManager.php(385): Cake\Controller\Component\AuthComponent->startup(Object(Cake\Event\Event))
#4 /home/MyApp/vendor/cakephp/cakephp/src/Event/EventManager.php(355): Cake\Event\EventManager->_callListener(Array, Object(Cake\Event\Event))
#5 /home/MyApp/vendor/cakephp/cakephp/src/Event/EventDispatcherTrait.php(78): Cake\Event\EventManager->dispatch(Object(Cake\Event\Event))
#6 /home/MyApp/vendor/cakephp/cakephp/src/Controller/Controller.php(495): Cake\Controller\Controller->dispatchEvent('Controller.star...')
#7 /home/MyApp/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(109): Cake\Controller\Controller->startupProcess()
#8 /home/MyApp/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\Pros\OwnersController))
#9 /home/MyApp/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#10 {main}

那么我该如何拦截这种身份验证尝试呢?

2 个答案:

答案 0 :(得分:1)

问题是由我在AppController中对API请求进行身份验证所做的修改引起的:
通常,您应该加载Auth组件:

    $this->loadComponent('Auth', [
        'authorize' => ['Controller'],
        'authenticate' => [
           'Form' => [
                'scope' => ['Users.active' => 1]
            ],
        ],
        'loginRedirect' => [
           'controller' => 'Users',
           'action' => 'account'
        ],
        'logoutRedirect' => [
            'controller' => 'Index',
            'action' => 'index'
        ]
    ]);

这样,您就可以在表单中验证填写凭证。

另一种方法是使用Basic身份验证。它的使用较少,但可以像这样实现。

    $this->loadComponent('Auth', [
        'authorize' => ['Controller'],
        'authenticate' => [
            'Basic' => [
                'fields' => ['username' => 'username', 'password' => 'password'],
                'userModel' => 'Users'
            ],
        ],
        'storage' => 'Memory',
        'unauthorizedRedirect' => false
    ]);

这样做会导致在您尝试访问网页时显示登录弹出窗口。

我不知道加载FormBasic身份验证是否真的有意义,但这是我先做的事情,因为我有时会看到弹出窗口,特别是当会话通过Form验证时过期。

如果您的网站需要normal身份验证机制,请在AppController.php中加载Auth组件Form。 如果您需要basic身份验证机制来进行API访问,我建议创建一个ApiController.php,您将在其中加载Auth组件Basic,如上所述。然后,API控制器将扩展ApiController而不是AppController。

这是我可以从我的知识中说出来的。 CakePHP大师可以添加更多信息或在必要时纠正我。

答案 1 :(得分:0)

我和帖子完全相同。我被认为是某人的帮助,我解决了这个问题。

我的配置auth组件之前:

$this->loadComponent('Auth', [
            'authenticate' => array(
                'Form' => array(
                    // 'fields' => array('username' => 'email'),
                    'scope' => array('is_delete' => '0')
                )
            ),

在我编辑之后,它运行得很好。

$this->loadComponent('Auth', [
            'authenticate' => array(
                'Form' => array(
                'userModel' => 'MUsers', //Add this line
                'fields' => array('username' => 'username',
                                   'password' => 'password'), //Edited this line
                    'scope' => array('is_delete' => '0')
                )
            ),

如果有人想知道要修复,请查看我的帖子:

Cakephp 3 - Auth session cannot destroy