我采用了CakePhp 2项目。我们从另一个项目到达项目,链接到CakePhp项目,其中包含“令牌”和会议ID作为URL中的参数。使用该令牌,我们授权用户,并使用会议ID从数据库中获取信息。会话值“auth”设置为true。
我们使用流浪汉机器在生产服务器上在我的系统上本地运行2个“平台”。在本地,会话值非常快速且随机地死亡。在生产服务器上并不常见,但是我们所遇到的问题似乎没有达到预期的效果,我们认为是由类似问题引起的。我们有许多不同的项目,所有Laravel,会议价值清晰的零问题。这个问题完全与CakePhp项目有关。
所有身份验证魔术都发生在beforeFilter
方法中。代码:
public function beforeFilter() {
$session = new CakeSession();
/**
*
* We will check if the current user is authorized here!
*
*/
// If the visitor is coming for the first time, there should be a parameter in
// the URL that is the auth code to check against the database.
if ( ( isset($_GET['conf']) && is_numeric($_GET['conf']) ) && isset($_GET['token']) ) {
$getConference = ClassRegistry::init('Conference')->find('first', ["conditions" => ["conference_id"=>$_GET['conf'] ]]);
$checkToken = ClassRegistry::init('User')->find('first', ["conditions" => ["remember_token"=>$_GET['token'] ]]);
if ($getConference && $checkToken) {
$checkToken['User']['remember_token'] = $this->generateToken();
if ( ClassRegistry::init('User')->save( $checkToken ) ) {
$session->write('auth', true);
$session->write('conferenceId', $_GET['conf']);
$this->redirect('/');
}
}
else {
$session->write('auth', false);
$session->write('conferenceId', null);
}
}
if (! $session->read('auth') || $session->read('conferenceId') == null ) {
echo "No permission!";
exit;
}
}
在控制器的顶部:
App::uses('CakeSession', 'Model/Datasource');
当存在URL参数时,它会捕获它们,完成工作,并在没有参数的情况下重定向到主路由。
$this->generateToken();
创建一个新令牌,并覆盖数据库中的旧令牌。
有2个主控制器。具有此代码的控制器是主项目控制器。它真正被击中的唯一时间是你第一次去项目,我们点击了索引方法。从那里开始,其他一切都是对其他控制器的AJAX调用。有一个链接,一个“主页”类型的链接将触及该索引方法。
有时这些Ajax调用会停止工作,单击该主页链接将输出“No Permission”而不是Ajax调用输出容器中的预期html
。
排除故障的步骤让我将这个beforeFilter
方法放在第二个控制器的顶部。现在,随机我将得不到许可。有时候,当我在链接到这个CakePhp项目的主项目上时,我点击该链接,我立刻就没有得到许可。
我找到了这个页面:cakephp takes me to login page on multiple request并尝试设置会话详细信息:
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => '300' // <- added this element
));
我试过了:
Configure::write('Session.timeout', '300');
此外,我在这两种情况下都尝试了cookieTimeout
。
我也试过
Configure::write('Security.level', 'low');
并包括
Configure::write('Session.autoRegenerate', true);
以任何顺序,任何这些都会导致会话立即轰炸。我得到“没有页面加载的许可,永远不会到达任何地方。
这个项目的代码老实说是垃圾。编写它的开发人员在整个地方都有错误和错误。最重要的是,我们是Laravel商店。我们只是试图让项目一直保持不变,直到将来某个时候我们可以从轨道上进行核对。所以我们只需要让它工作。有什么可能导致这个问题的想法?我忘记包含哪些其他细节可以帮助解决这个问题?
由于
答案 0 :(得分:1)
Reading & writing session data
您可以使用Set::classicExtract()
兼容语法从会话中读取值:
CakeSession::read('Config.language');
$key
应该是您希望将$value
写入的点分隔路径:
CakeSession::write('Config.language', 'eng');
当您需要从会话中删除数据时,可以使用delete:
CakeSession::delete('Config.language');
您还应该看到Sessions和SessionHelper上的文档,了解如何在控制器和视图中访问会话数据。