CakePHP loginAction不起作用

时间:2015-09-16 17:20:13

标签: php cakephp

我想要的是什么:
当用户未登录并尝试通过任何网址访问该网站时,他们会被重定向到/登陆(其上有一个表单,其上发布到/ login)

发生了什么:
当用户未登录并尝试通过任何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'可能是解决方案,但它没有帮助

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你错过了控制器?

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

答案 1 :(得分:0)

从您的代码段看起来,您将$this->Auth->allow()规则放在beforeFilter()的{​​{1}}方法中:

AppController

问题在于,由于您的public function beforeFilter() { $this->Auth->allow('login', 'landing'); } 路由指向/landing控制器而pages指向您的/login控制器,除非您的控制器有users方法调用他们父母的方法是这样的:

beforeFilter()

这些规则永远不会采取行动。如果您在上面添加此代码,那么您实际上允许两个控制器中的public function beforeFilter() { parent::beforeFilter(); } landing方法(如果存在)。

现在的样子,父母(显然)从未被调用过,所以当你访问login之类的网址时,你会被/bogus重定向到/landing } AuthComponent。但由于loginAction控制器pages中从未明确允许,因此您会再次重定向到beforeFilter()。无论您访问的是什么网址,整个过程看起来都始终重定向到/login

请注意,正如您所拥有的那样,/login的{​​{1}}规则既未执行。你可以访问allow(),因为蛋糕会自动允许它(否则你会以无限循环结束)。

首先从login删除/login规则。你不需要它。

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

最后一项更改将允许pages操作作为参数传递给任何给定页面(例如displaydisplaylanding或您可能拥有的任何其他内容。如果您不希望这样,则应在homeeula中添加一项检查,如果参数为beforeFilter(),则仅允许请求继续。