授权的公共URL保持重定向以进行身份​​验证和失败

时间:2017-08-22 16:59:10

标签: cakephp cakephp-2.0

在这种情况下,OurCustomAuth当前正在返回 false 的预期值,正在达到相应的其他值,但users/error路径会保持重定向,即使它已经重定向。已被公开,不需要任何身份验证。

我已设置新动作:

C:\wamp\myapp\app>Console\cake AclExtras.AclExtras aco_update

Welcome to CakePHP v2.4.9 Console
---------------------------------------------------------------
App : app
Path: C:\wamp\myapp\app\
---------------------------------------------------------------
Created Aco node: controllers/Users/error
Aco Update Complete

UsersController中,我已添加要公开的操作:

public function beforeFilter() {
    parent::beforeFilter ();
    $this->Auth->allow ('logout', 'error');
}

AppControllerAuth配置:

public $components = array(
    'Acl',
    'Cookie',
    'DebugKit.Toolbar', 'Session',
    'Auth' => array(
        'authenticate' => array('OurCustomAuth'),
        'loginAction' => array('controller' => 'users', 'action' => 'view'),
        'authError' => 'Did you really think you are allowed to see that?',
        'authorize' => array('Actions' => array('actionPath' => 'controllers'))
    )
);

...
public function beforeFilter() {
    ...

    //Auto logging users in if they are not logged in
    if (!AuthComponent::user('id')) {

        if ($this->Auth->login()) {

            //stuff here

        } else {
            $this->Session->setFlash(__('We could not authenticate you ...'));
            return $this->redirect(array('controller' => 'Users', 'action' => 'error'));
        }
    }

    ...
}

我在Firefox中遇到的错误:

  

页面未正确重定向

     

Firefox检测到服务器正在重定向请求   这个地址永远不会完成。

更新#1

$this->Auth->login()基本上抓取请求标头,在这种情况下是故意错误的,它似乎重定向到适当的链接。但是,/users/error不应导致重定向,因为它已从身份验证中排除。

1 个答案:

答案 0 :(得分:1)

问题是您在每个请求上运行登录代码,即在app controllers beforeFilter()方法中运行。因此,当该代码重定向到/users/error因为您未登录时,代码将再次针对该控制器/操作运行,并再次重定向您,并再次重新定位...

如果您需要为每个请求运行此代码,那么您必须手动检查允许的操作,即通过$this->Auth->allow()允许的操作,并仅在当前操作不是&时运行您的代码#39;允许。检查 AuthComponent::_isAllowed() 的代码,您只需稍加修改即可轻松使用该代码:

$action = strtolower($this->request->params['action']);
if (!in_array($action, array_map('strtolower', $this->Auth->allowedActions))) {
    //Auto logging users in if they are not logged in
    if (!AuthComponent::user('id')) {
        // ...
    }
}