Mediawiki SessionProvider $_SESSION 变量为空

Mediawiki SessionProvider $_SESSION variable is empty

我正在尝试为 mediawiki 安装实施 SessionProvider 授权插件。

我正在尝试与现有的身份验证系统集成,该系统使用 $_SESSION 来指示用户已登录,但是我尝试的任何方法,我得到的结果 $_SESSION 变量class' provideSessionInfo 函数为空。

以前这是通过 onUserLoadFromSession 挂钩完成的(其中包含下面的大部分逻辑代码),但更新似乎已经中断,实际上查看现有的 $_SESSION:

public function provideSessionInfo(WebRequest $request)
{
    // $_SESSION is hidden away per-request, but $request->getSession likes to call this function (yay infinite loops)
    if (!isset($_SESSION['memberid'])) {
        return null;
    }
    $memberid = $_SESSION['memberid'];

    $mr_user = MyRadio_User::getInstance($memberid);
    $user = User::newFromName($memberid);
    $dbr = wfGetDB(DB_REPLICA);
    $s = $dbr->selectRow('user', ['user_id'], ['user_name' => $memberid]);
    if ($s === false) {
        return null;
    } else {
        $user->mName = $memberid;
        $user->mId = $user->idForName();
        $user->loadFromDatabase();
        $user->saveSettings();
    }

    if ($mr_user->hasAuth(AUTH_WIKIADMIN) && !in_array('sysop', $user->getGroups())) {
        $user->addGroup('sysop');
    }

    $user->mTouched = wfTimestampnow();

    return new SessionInfo(SessionInfo::MAX_PRIORITY, [
        'provider' => $this,
        'persisted' => true,
        'userInfo' => UserInfo::newFromUser($user, true),
    ]);
}

如果我硬编码 $memberid,函数和会话提供程序工作正常,但我似乎无法找到一种方法从 PHP "application" 传输会话给另一个。

添加调试显示 PHPSESSID 变量仍设置在 cookie 中,但无论出于何种原因无法将其拉出到实际会话对象中。我尝试了各种 session_start() 风格的方法都没有效果。

我觉得我遗漏了一些明显的东西,但这些东西的文档只是一个基本的 wiki 页面和原始生成的 doxygen。

会话处理不是跨应用程序通信的好方法。 MediaWiki 使用自己的会话处理,这意味着 MediaWiki 中的 $_SESSION 和您的应用程序中的 $_SESSION 之间根本没有任何联系。第一个将从 MediaWiki 的对象缓存(由 $wgSessionCacheType 配置)填充,另一个从 PHP 会话文件或其他任何内容填充。

如果你真的没有更好的方法来传递数据,你将不得不编写一个自定义访问 class,它可以被你的提供者调用,它将保存当前的会话处理程序,安装一个空会话处理程序(恢复 PHP 的本机会话处理,有望与其他应用程序互操作),启动会话,获取会话数据,恢复原始会话处理程序,并可能再次启动会话。