我想要什么:
当用户没有登录并试图访问任何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();
}
这些规则永远不会起作用。如果您在上面添加此代码,那么实际上在两个控制器中都允许landing
和login
方法(如果存在的话(。
现在的情况是,父级(显然(从未被调用,因此当您访问像/bogus
这样的url时,您会被重定向到/landing
,就像您在AuthComponent
的loginAction
中设置的那样。但由于这在pages
控制器beforeFilter()
中从未明确允许,因此您将再次重定向到/login
。整个过程看起来,无论您访问哪个url,总是重定向到/login
。
请记住,正如您所拥有的,login
的allow()
规则既不执行。不过,您可以访问/login
,因为蛋糕会自动允许它(否则您将陷入无休止的循环(。
因此,首先从allow()
中删除landing
规则。你不需要它。
然后将beforeFilter()
代码移动到pages
控制器。将landing
更改为display
,因为被调用的方法是该控制器内的display
,并传递参数landing
。那里没有landing
方法(我假设-如果有,路由指向pages
'display
,所以不会有任何效果(!
最后一个更改将使display
操作可以用于作为参数传递的任何给定页面(如landing
、home
、eula
或您可能拥有的任何其他页面(。如果您不想这样做,您应该在beforeFilter()
或display()
中添加一个检查,并且只有当参数为landing
时才允许请求继续。