我正在尝试为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。
答案 0 :(得分:1)
会话处理不是跨应用程序通信的好方法。 MediaWiki使用自己的会话处理,这意味着MediaWiki中的$_SESSION
与应用程序中的$_SESSION
之间没有任何关联。第一个将从MediaWiki的对象缓存(由$wgSessionCacheType
配置)填充,另一个将从PHP会话文件或其他任何内容填充。
如果您确实没有更好的方法来传递数据,那么您必须编写一个可由您的提供程序调用的自定义访问类,它将保存当前的会话处理程序,安装空会话处理程序(恢复PHP的原生会话处理,希望能与其他应用程序互操作),启动会话,获取会话数据,恢复原始会话处理程序,并可能再次启动会话。