在将功能齐全的 Cake 1.3 应用程序迁移到最近发布的 2.0 版本后,身份验证已停止工作。
我已经根据更新的 2.0 手册更改了操作的调用AuthComponent
和结构,login
但无济于事。奇怪的是,当用户$this->Auth->login()
到达登录功能的一部分时,用户实际上被验证了,用户被重定向到设置的 url $this->Auth->redirect()
。然而,在重定向之后,$this->Auth->user()
返回空(以及AuthComponent::user()
)并且用户没有通过 Auth 组件登录。
Cake 在此过程中不会抛出任何错误,'auth' 的 flash 消息保持为空。
用户存储在一个简单的数据库表中,其中包含 id、username、email、password 和 timestamp 列。密码是散列的,我已经使用新的 Cake 2.0 方法添加了一些用户。
这是 AppController.php 的代码:
<?php
class AppController extends Controller {
public $helpers = array('Session', 'Html', 'Time', 'Form', 'Text');
public $components = array('Session', 'RequestHandler', 'Auth');
public function beforeFilter() {
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'maps', 'action' => 'index');
$this->Auth->logoutRedirect = array('controller' => 'maps', 'action' => 'index');
}
}
?>
用户控制器.php:
<?php
class UsersController extends AppController {
public $name = 'Users';
function beforeFilter() {
parent::beforeFilter();
}
function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
}
}
}
function logout() {
$this->redirect($this->Auth->logout());
}
}
?>
User.php 模型。解决此问题后,我暂时禁用了表单验证:
<?php
class User extends AppModel {
public $name = 'User';
}
?>
登录视图:
<?php
echo $this->Form->create('User');
echo $this->Form->input('username', array('label' => 'Username', 'before' => '<p class="input" id="username">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
echo $this->Form->input('password', array('label' => 'Password', 'before' => '<p class="input" id="password">', 'after' => '</p>', 'between' => '<br />', 'div' => false));
echo $this->Form->end('Login');
?>
我还尝试在 中的$components
变量中设置一些 Auth 功能AppController
,但效果不佳:
public $components = array(
'Auth'=> array(
'loginAction' => array(
'controller' => 'users',
'action' => 'login',
),
'loginRedirect' => array(
'controller' => 'maps',
'action' => 'index',
),
'authenticate' => array(
'Form' => array(
'fields' => array('username', 'password')
)
)
)
);
是什么导致了这里的问题?路由可能?我已经注释掉了所有路线,除了:
require CAKE . 'Config' . DS . 'routes.php';
更新:
在 UsersController 的登录方法中添加一些调试语句后,我现在知道$this->Auth->user()
在调用$this->Auth->login()
. 然而,在重定向到另一个控制器后,登录会话完全丢失。所以我仍然不知道这里出了什么问题。
更新 2 我已经重新启动了迁移过程,方法是使用我的工作 1.3 应用程序并像上次一样在其上运行迁移控制台脚本。
这次我注意到脚本因为两个与自定义组件有关的错误而停止。组件类现在应该扩展 Component,而不是 1.3 的默认值:Object。
在修复了这些组件错误后,我再次运行了迁移脚本(在第一次迁移尝试期间我忽略了这样做)并实现了新的 AuthCompenent 调用。到目前为止,一切似乎都正常工作。不确定现在有什么不同以及第一次出了什么问题,因为 Cake 没有输出任何错误消息。
更新 3 越来越奇怪了。我以为我解决了它,但是在将我的代码转移到另一台开发机器之后,Auth 突然停止工作。它正在我的主要设置上工作,但是在另一个测试上它在相同的情况下再次失败。我已经清除了缓存以确保它仍然无法正常工作。Cake 不会产生任何错误输出。
更新 4 这似乎是我机器上的会话问题。我刚刚将 Session 设置为存储在 cookie 中,突然 Auth 又开始工作了。不知道为什么默认会话不起作用,在这种情况下我不知道从哪里开始调试。
只有 cookie 会话似乎有效,定义数据库会话与常规会话具有相同的结果;身份验证停止工作。