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 的本机会话处理,有望与其他应用程序互操作),启动会话,获取会话数据,恢复原始会话处理程序,并可能再次启动会话。
我正在尝试为 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 的本机会话处理,有望与其他应用程序互操作),启动会话,获取会话数据,恢复原始会话处理程序,并可能再次启动会话。