【问题标题】:CakePHP3.x: authentication required popupCakePHP3.x:需要身份验证的弹出窗口
【发布时间】:2016-08-30 10:28:47
【问题描述】:

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

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

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

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

问候,

编辑我的登录表单

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

** EDIT ** 当我在浏览器打开的弹出窗口中输入我的登录名/密码时,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}

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

【问题讨论】:

  • 能否请您发布登录表单
  • @dav Hi Dav,完成了。
  • 如果您的猜测是正确的,但它不会采取正确的行动,您可以尝试输入此$this-&gt;FormB-&gt;create('Users', array( 'url' =&gt; '/users/your_login_action')) - 因此提供提交表单的确切网址
  • @dav,恐怕听不懂你。我的登录完美适用于我的登录页面。当我尝试访问特定 url 并且 Firefox/Chrome 打开一个弹出窗口要求我登录时,就会出现我的问题。在那种特定情况下,我不知道应该如何处理这个弹出窗口。
  • @dav,好的,谢谢所以我现在明白我的问题了

标签: cakephp-3.x


【解决方案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 中使用Form 加载Auth 组件。 如果您需要basic 身份验证机制来访问 API,我建议创建一个 ApiController.php,您将在其中加载带有 BasicAuth 组件,如上所述。然后,您的 API 控制器将扩展 ApiController 而不是 AppController。

根据我的知识,这是我可以说的。如果需要,CakePHP 大师可以添加更多信息或纠正我。

【讨论】:

    【解决方案2】:

    我的问题与帖子完全相同。有人认为我提供了帮助,我解决了这个问题。

    我之前的配置验证组件:

    $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

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2020-08-28
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多