Mediawiki SessionProvider $ _SESSION变量为空

时间:2017-07-02 19:47:45

标签: php session mediawiki

我正在尝试为mediawiki安装实现 SessionProvider auth插件。

我尝试与使用$_SESSION的现有auth系统集成以指示用户已登录,但是我尝试的任何方法,我得到的$_SESSION变量班级' 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"应用程序"到另一个。

添加调试显示仍然在cookie中设置了PHPSESSID变量,但无论出于何种原因,它都不能被拉出到实际的会话对象中。我尝试过各种session_start()样式方法无效。

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

1 个答案:

答案 0 :(得分:1)

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

如果您确实没有更好的方法来传递数据,那么您必须编写一个可由您的提供程序调用的自定义访问类,它将保存当前的会话处理程序,安装空会话处理程序(恢复PHP的原生会话处理,希望能与其他应用程序互操作),启动会话,获取会话数据,恢复原始会话处理程序,并可能再次启动会话。