You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将现有PHP Session与MediaWiki集成,实现自动登录同步?

嘿,这个需求我帮很多人解决过,不用死磕那些晦涩的SessionManager/AuthManager文档,咱们用MediaWiki的钩子就能轻松实现主站Session自动同步登录,而且完全不会拖慢主站——毕竟只有访问Wiki的用户才会触发这个逻辑,完美契合你的需求!

核心思路

咱们的目标是:当用户访问Wiki时,让MediaWiki主动检查主站的PHP Session是否存在已登录用户,如果有,就自动完成Wiki的登录流程,不用用户手动操作。核心是利用MediaWiki的AuthManagerAutoLogin钩子,这个钩子专门用来处理自动登录场景,非常适合咱们的需求。

具体实现步骤

1. 确保主站与MediaWiki共享PHP Session

这是基础中的基础,只有Session共享了,MediaWiki才能读取到主站的登录状态。需要做这些配置:

  • 统一Session配置:确保主站和MediaWiki的php.ini里这些参数一致:
    • session.name:默认是PHPSESSID,最好保持统一,避免混淆
    • session.cookie_domain:如果是子域名(比如主站是example.com,Wiki是wiki.example.com),要设为.example.com(注意前面的点),这样Cookie能在所有子域名共享
    • session.save_path:如果主站和Wiki在同一服务器,直接设为同一个路径;如果在不同服务器,建议用Redis这类分布式Session存储,两边都配置session.save_handler = redis并指向同一个Redis实例
  • 匹配MediaWiki的Cookie设置:在Wiki的LocalSettings.php里,确保$wgSessionCookieOptions和主站的Cookie参数一致,比如:
    $wgSessionCookieOptions = [
        'domain' => '.example.com',
        'secure' => true, // 如果用HTTPS的话开启
        'httponly' => true,
        'samesite' => 'Lax'
    ];
    

2. 编写自定义MediaWiki扩展

咱们要写一个极简的扩展,用来挂载AuthManagerAutoLogin钩子,实现Session检查和自动登录逻辑:

步骤2.1 创建扩展目录和文件

在MediaWiki的extensions文件夹下新建MainSiteAuth目录,然后创建两个文件:

文件1:MainSiteAuth.php

<?php
// 加载扩展
wfLoadExtension( 'MainSiteAuth' );

// 注册自动登录钩子
$wgHooks['AuthManagerAutoLogin'][] = 'MainSiteAuthAutoLogin';

/**
 * 处理主站Session自动登录逻辑
 * @param string &$username 要登录的Wiki用户名
 * @param int &$result 登录结果(AuthManager::AUTLOGIN_SUCCESS 表示成功)
 * @return bool 是否继续执行后续钩子
 */
function MainSiteAuthAutoLogin( &$username, &$result ) {
    // 启动Session(如果MediaWiki还没初始化Session的话)
    if ( !session_id() ) {
        // 注意:如果主站用了自定义Session名称,这里要先设置
        // session_name('YOUR_MAIN_SITE_SESSION_NAME');
        session_start();
    }

    // 检查主站Session中的登录标识(这里要和你的主站Session键名对应)
    // 比如主站用$_SESSION['logged_in_user']存储用户名,就改成这个键
    if ( isset( $_SESSION['main_site_username'] ) && !empty( $_SESSION['main_site_username'] ) ) {
        $mainSiteUsername = $_SESSION['main_site_username'];
        
        // 在Wiki中查找对应用户
        $user = User::newFromName( $mainSiteUsername );
        
        // 如果用户不存在,可选自动创建(根据你的需求调整)
        if ( !$user || $user->isAnon() ) {
            $user = User::createNew(
                $mainSiteUsername,
                [
                    'email' => $_SESSION['main_site_email'] ?? '', // 从主站Session取邮箱
                    'real_name' => $_SESSION['main_site_realname'] ?? '' // 取真实姓名
                ]
            );
            
            // 如果创建失败,返回匿名状态
            if ( $user instanceof Status && !$user->isOK() ) {
                return true;
            }
        }

        // 设置自动登录的用户名
        $username = $user->getName();
        // 标记登录成功
        $result = AuthManager::AUTLOGIN_SUCCESS;
        
        // 返回false,停止执行其他自动登录钩子
        return false;
    }

    // 没有主站登录Session,继续执行Wiki默认的认证流程
    return true;
}

文件2:extension.json

这是MediaWiki扩展的配置文件,用来声明扩展信息和钩子:

{
    "name": "MainSiteAuth",
    "version": "1.0",
    "author": "Your Name",
    "description": "Auto-login users from main site PHP Session",
    "license-name": "GPL-2.0-or-later",
    "requires": {
        "MediaWiki": ">=1.35" // 根据你的MediaWiki版本调整
    },
    "Hooks": {
        "AuthManagerAutoLogin": "MainSiteAuthAutoLogin"
    }
}

3. 启用扩展

在MediaWiki的LocalSettings.php文件末尾添加一行:

wfLoadExtension( 'MainSiteAuth' );
关键注意事项
  • Session安全性:一定要确保主站的Session不可篡改!开启session.cookie_httponlysession.cookie_secure(HTTPS环境下),用户登录时调用session_regenerate_id(true)更新Session ID,防止会话劫持。
  • 用户创建逻辑:如果你的业务不允许自动创建Wiki用户,可以删除代码中创建用户的部分,只允许已存在的Wiki用户同步登录——这样主站用户如果在Wiki里没有账号,就会保持匿名状态。
  • 测试验证:先在主站登录,然后打开Wiki页面,查看右上角的用户状态,如果显示主站的用户名,就说明同步成功了。如果没成功,先检查Session配置是否一致,比如Cookie的domain是否正确,Session ID在主站和Wiki中是否相同。

内容的提问来源于stack exchange,提问作者Saleh Altahini

火山引擎 最新活动