MediaWiki校验用户登录状态的代码位置及修改咨询
MediaWiki 登录校验逻辑定位及URL Token校验实现方案
核心校验逻辑代码位置
- 默认Session校验的核心入口为
includes/user/User.php中的loadFromSession()方法,所有页面请求初始化阶段都会调用该方法从Session加载当前登录用户的身份信息。 - 会话管理的顶层逻辑位于
MediaWiki\Session\SessionManager类(对应路径includes/session/SessionManager.php),负责全局会话的初始化和用户身份匹配,是默认校验流程的上游入口。 - MediaWiki 1.35及以上版本还可通过
UserLoadFromSession钩子介入校验流程,无需修改核心代码即可替换默认校验逻辑。
自定义URL Token校验实现方案
无需改动MediaWiki核心源码,通过注册钩子即可实现需求:
- 在你的自定义扩展或者
LocalSettings.php末尾注册UserLoadFromSession钩子,该钩子会在系统尝试从Session加载用户之前触发,返回false即可终止默认Session校验流程。 - 参考以下示例实现你的token校验逻辑:
$wgHooks['UserLoadFromSession'][] = function ( User $user, &$loaded ) { // 获取URL中携带的校验token,参数名可自行修改 $requestToken = $user->getRequest()->getVal('auth_token', ''); if (empty($requestToken)) { // 无有效token时可直接返回走默认逻辑,或者直接返回未登录状态 return true; } // 此处替换为你自己的token校验逻辑:校验token有效性、匹配对应用户ID $validTokenMap = [ // 示例token映射,实际场景建议从数据库、缓存中读取有效token及关联用户 'your_valid_token_123' => 2, 'your_valid_token_456' => 5 ]; if (isset($validTokenMap[$requestToken])) { $targetUserId = $validTokenMap[$requestToken]; $user->setId($targetUserId); $user->loadFromId(); // 标记用户身份已加载,终止后续默认校验 $loaded = true; return false; } return true; };
- 注意:不要直接使用MediaWiki原生的用户令牌作为URL传输的校验token,原生令牌的安全设计不适合暴露在URL中,你需要自行实现token的生成、过期校验、单次有效性校验、销毁逻辑,避免身份伪造风险。
- 如果你需要对MediaWiki托管的静态资源(图片、附件等)也做token校验,需要额外修改
includes/Media.php中的资源输出前置逻辑,MediaWiki默认不会对静态资源走用户身份校验流程。
内容的提问来源于stack exchange,提问作者Rafael Kasper
相关产品推荐
相关产品推荐

