CakePHP登录操作不起作用


CakePHP loginAction not working

我想要什么:
当用户没有登录并试图访问任何url的网站时,他们会被重定向到/登录(上面有一个发布到/登录的表单(

发生了什么:
当用户没有登录并试图访问任何url的网站时,他们会被重定向到/login


在我的AppController中,我有:

public $components = array(
        'Auth' => array(
            ...
            'loginRedirect' => array('controller' => 'twitter', 'action' => 'index'),
            'loginAction' => '/landing',
            'logoutRedirect' => '/landing',
            'unauthorizedRedirect' => '/landing',
            'authorize' => array('Actions' => array('actionPath' => 'controllers'))
        ));
        public function beforeFilter() {
            $this->Auth->allow('login', 'landing');
        }

我原以为'loginAction' => '/landing'会是解决方案,但它对没有帮助

有什么想法吗?

您缺少控制器吗?

'Auth' => array(
            'loginRedirect' => array(
                'controller' => 'items',
                'action' => 'index'
            ),
            'logoutRedirect' => array(
                'controller' => 'users',
                'action' => 'login'
            ),
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => 'Blowfish'
                )
            )
        )

从您的代码片段来看,您似乎正在将$this->Auth->allow()规则放入AppController:的beforeFilter()方法中

public function beforeFilter() {
    $this->Auth->allow('login', 'landing');
}

问题是,由于您的/landing路由指向pages控制器,/login指向users控制器,除非您的控制器的beforeFilter()方法像这样调用其父方法:

public function beforeFilter() {
    parent::beforeFilter();
}

这些规则永远不会起作用。如果您在上面添加此代码,那么实际上在两个控制器中都允许landinglogin方法(如果存在的话(。

现在的情况是,父级(显然(从未被调用,因此当您访问像/bogus这样的url时,您会被重定向到/landing,就像您在AuthComponentloginAction中设置的那样。但由于这在pages控制器beforeFilter()中从未明确允许,因此您将再次重定向到/login。整个过程看起来,无论您访问哪个url,总是重定向到/login

请记住,正如您所拥有的,loginallow()规则既不执行。不过,您可以访问/login,因为蛋糕会自动允许它(否则您将陷入无休止的循环(。

因此,首先从allow()中删除landing规则。你不需要它。

然后将beforeFilter()代码移动到pages控制器。将landing更改为display,因为被调用的方法是该控制器内的display,并传递参数landing。那里没有landing方法(我假设-如果有,路由指向pages'display,所以不会有任何效果(!

最后一个更改将使display操作可以用于作为参数传递的任何给定页面(如landinghomeeula或您可能拥有的任何其他页面(。如果您不想这样做,您应该在beforeFilter()display()中添加一个检查,并且只有当参数为landing时才允许请求继续。