我想要的是什么:
当用户未登录并尝试通过任何网址访问该网站时,他们会被重定向到/登陆(其上有一个表单,其上发布到/ 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'
可能是解决方案,但它没有帮助
有什么想法吗?
答案 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
操作作为参数传递给任何给定页面(例如display
,display
,landing
或您可能拥有的任何其他内容。如果您不希望这样,则应在home
或eula
中添加一项检查,如果参数为beforeFilter()
,则仅允许请求继续。