我正在为需要密码才能查看的特定页面构建一个非常基本的身份验证系统。我发现了其他几个听起来类似的问题,但唯一有明确解决方案的问题涉及的配置设置似乎无法解决我的问题。由于某种原因,$this->Session->write(...)
总是返回false。
这是我的配置设置:
Configure::write('Session', array(
'defaults' => 'php'
));
以下是我尝试在控制器操作中写入会话的地方:
private function _handle_auth_attempt( $object ) {
$submitted_pass = $this->request->data['Object']['password'];
$correct_pass = $object['Object']['password'];
$auth_cookie_name = $this->Object->auth_cookie_name($object);
debug($auth_cookie_name); //'Object1.pass'
debug($submitted_pass); //'foobar'
if ( md5($submitted_pass) == md5($correct_pass) ) {
$write1 = $this->Session->write( $auth_cookie_name, md5($submitted_pass) );
$write2 = CakeSession::write( $auth_cookie_name, md5($submitted_pass) );
debug($write1); //FALSE
debug($write2); //FALSE
return TRUE;
}
$this->Session->setFlash('The password you entered is incorrect.');
$this->redirect( $this->referer() );
}
更新
在_handle_auth_attempt()
内部,我添加了:
$_SESSION['foo'] = 'bar';
$this->Session-read('foo'); //'bar'
它们工作得很好。所以我确信这不是权限问题。
从源代码来看,FALSE的一种可能性是会话名称为空。那么你能检查一下的结果吗
debug($auth_cookie_name);
我根本不明白这一点,但我从会话cookie的名称中删除了".",这导致Session->write()
再次工作。
$this->Session->write('Object1.pass'); //FALSE
$this->Session->write('Object1pass'); //TRUE
虽然这解决了我眼前的问题,但我很想更好地理解这个问题。
更新
经过仔细思考,我怀疑发生的事情是多种因素的结合:
- CakePHP使用"点"表示法将会话存储在数组中,我没有考虑到这一点
- 我第一次运行代码时,它可能起作用了
- 但是它在随后的每一次尝试中都返回CCD_ 4,因为它已经存在<--未经测试
- 我无法解释为什么
read()
返回false
所有会话读/写都属于控制器:
$this->Session->write('User.still_login', 'Yes');
echo $this->Session->read('User.still_login'); // Yes as output