将功能齐全的Cake 1.3应用程序迁移到最近发布的2.0版本后,身份验证已停止运行。
我根据更新的2.0手册更改了AuthComponent
的调用和login
操作的结构,但无济于事。奇怪的是,用户实际上由$this->Auth->login()
验证,因为它到达登录功能的一部分,用户将重定向到$this->Auth->redirect()
设置的URL。但是,在重定向之后,$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');
}
}
?>
UserController.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
的{{1}}变量中设置一些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')
)
)
)
);
更新
在UsersController中的login方法中添加一些调试语句后,我现在知道require CAKE . 'Config' . DS . 'routes.php';
实际上在调用$this->Auth->user()
后填充了正确的用户。然而,在重定向到另一个控制器之后,登录会话完全丢失。所以我仍然不知道这里出了什么问题。
更新2 我已经重新启动了迁移过程,方法是使用我的1.3应用程序,并像上次一样运行迁移控制台脚本。
这次我注意到脚本由于与自定义组件相关的两个错误而停止了。组件类现在应该扩展Component,而不是1.3 default:Object。
在修复这些组件错误之后,我再次运行了迁移脚本(我在第一次迁移尝试期间忽略了这一点)并实现了新的AuthCompenent调用。到目前为止,一切似乎都正常。不确定现在有什么不同,第一次出了什么问题,因为Cake没有输出任何错误消息。
更新3 它越来越怪异了。我以为我解决了它,但在将我的代码转移到另一台开发机器后,Auth突然停止工作。它正在我的主要设置上工作,但在另一个测试时,它会在同一场景下再次失败。我已经清除缓存以确定,但它仍然无法正常工作。 Cake不会生成任何错误输出。
更新4 它似乎是我的机器上的会话问题。我只是将Session设置为存储在cookie中,突然Auth再次开始工作。不确定为什么默认会话不起作用,我不知道在那种情况下从哪里开始调试。
只有cookie会话似乎有效,定义数据库会话与常规会话具有相同的结果; Auth停止工作。
答案 0 :(得分:1)
尝试在/Config/core.php中启用use_trans_sid:
Configure::write('Session', array(
//'defaults' => 'php'
'defaults' => 'cake',
'cookie' => 'CAKEPHP2',
'ini' => array('session.use_trans_sid' => true)
));
答案 1 :(得分:0)
您是否还尝试配置身份验证处理程序?
public $components = array(
'Auth'=> array(
'authenticate' => array('Form')
)
);