CakePHP登录不工作
我想要什么:CakePHP登录不工作,php,cakephp,Php,Cakephp,我想要什么: 当用户未登录并尝试通过任何url访问站点时,他们会被重定向到/landing(该url上有一个表单可发布到/login) 发生了什么: 当用户未登录并尝试通过任何url访问站点时,他们会被重定向到/login 在我的AppController中,我有: public $components = array( 'Auth' => array( ... 'loginRedirect' => array('co
当用户未登录并尝试通过任何url访问站点时,他们会被重定向到/landing(该url上有一个表单可发布到/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'
会是解决方案,但没有帮助
有什么想法吗?您缺少控制器了吗
'Auth' => array(
'loginRedirect' => array(
'controller' => 'items',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'users',
'action' => 'login'
),
'authenticate' => array(
'Form' => array(
'passwordHasher' => 'Blowfish'
)
)
)
你找不到控制器了
'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
路由指向您的页面
控制器,而/login
指向您的用户
控制器,除非您的控制器的beforeFilter()
方法调用其父方法如下:
public function beforeFilter() {
parent::beforeFilter();
}
这些规则永远不会采取行动。如果您在上面添加此代码,实际上您允许两个控制器中的登陆
和登录
方法(如果存在)
现在的情况是,父对象(显然)从未被调用,因此当您访问像/bogus
这样的url时,您会被重定向到/landing
,正如您在AuthComponent
的登录操作中设置的那样。但由于在页面
controllerbeforeFilter()
中从未明确允许这样做,因此您会再次被重定向到/login
。整个过程看起来就像你总是被重定向到/login
,无论你访问哪个url
请记住,您现有的allow()
登录规则既不执行也不执行。不过,您可以访问/login
,因为cake会自动允许它(否则您将陷入无休止的循环)
因此,首先从allow()
中删除landing
规则。你不需要它
然后将beforeFilter()
代码移动到页面
控制器。将landing
更改为display
,因为在该控制器内调用的方法是display
,并传递参数landing
。那里没有登陆
方法(我假设-如果有,路由指向页面
“显示
,因此不会有任何效果)
最后一个更改将使显示作为参数传递的任何给定页面所允许的操作(如登录
,主页
,eula
或您可能拥有的任何其他内容)。如果您不想在beforeFilter()
或display()
中添加检查,并且仅当参数是landing
时,才允许请求继续从您的代码段中添加$this->Auth->allow()规则
AppController的方法
:
public function beforeFilter() {
$this->Auth->allow('login', 'landing');
}
问题在于,由于您的/landing
路由指向您的页面
控制器,而/login
指向您的用户
控制器,除非您的控制器的beforeFilter()
方法调用其父方法如下:
public function beforeFilter() {
parent::beforeFilter();
}
这些规则永远不会采取行动。如果您在上面添加此代码,实际上您允许两个控制器中的登陆
和登录
方法(如果存在)
现在的情况是,父对象(显然)从未被调用,因此当您访问像/bogus
这样的url时,您会被重定向到/landing
,正如您在AuthComponent
的登录操作中设置的那样。但由于在页面
controllerbeforeFilter()
中从未明确允许这样做,因此您会再次被重定向到/login
。整个过程看起来就像你总是被重定向到/login
,无论你访问哪个url
请记住,您现有的allow()
登录规则既不执行也不执行。不过,您可以访问/login
,因为cake会自动允许它(否则您将陷入无休止的循环)
因此,首先从allow()
中删除landing
规则。你不需要它
然后将beforeFilter()
代码移动到页面
控制器。将landing
更改为display
,因为在该控制器内调用的方法是display
,并传递参数landing
。那里没有登陆
方法(我假设-如果有,路由指向页面
“显示
,因此不会有任何效果)
最后一个更改将使显示作为参数传递的任何给定页面所允许的操作(如登录
,主页
,eula
或您可能拥有的任何其他内容)。如果您不想在beforeFilter()
或display()
中添加检查,并且仅当参数为landing
时才允许请求继续,您只允许用户访问beforeFilter中的“login”页面,尝试添加“landing”到我已经添加的页面,忘记将其添加到代码段中。现在更新了/landing
和/login
的路径分别指向哪里?/landing is/pages/display/landing/登录名为/users/login您只允许用户访问beforeFilter中的“登录”页面,尝试添加“登录”页面。我已经添加了,但忘记将其添加到代码段中。现在更新了/landing
和/login
的路径分别指向哪里?/landing is/pages/display/landing/登录is/users/login/login和/登陆被路由到各自的控制器和操作。使用数组表单仍然无法使用/login和/lan