CakePhp会话几乎立即清除,但有时仅

时间:2017-05-24 16:10:27

标签: php ajax session cakephp

我采用了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商店。我们只是试图让项目一直保持不变,直到将来某个时候我们可以从轨道上进行核对。所以我们只需要让它工作。有什么可能导致这个问题的想法?我忘记包含哪些其他细节可以帮助解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

Reading & writing session data

您可以使用Set::classicExtract()兼容语法从会话中读取值:

CakeSession::read('Config.language');

$key应该是您希望将$value写入的点分隔路径:

CakeSession::write('Config.language', 'eng');

当您需要从会话中删除数据时,可以使用delete:

CakeSession::delete('Config.language');

您还应该看到SessionsSessionHelper上的文档,了解如何在控制器和视图中访问会话数据。