如何将现有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_httponly和session.cookie_secure(HTTPS环境下),用户登录时调用session_regenerate_id(true)更新Session ID,防止会话劫持。 - 用户创建逻辑:如果你的业务不允许自动创建Wiki用户,可以删除代码中创建用户的部分,只允许已存在的Wiki用户同步登录——这样主站用户如果在Wiki里没有账号,就会保持匿名状态。
- 测试验证:先在主站登录,然后打开Wiki页面,查看右上角的用户状态,如果显示主站的用户名,就说明同步成功了。如果没成功,先检查Session配置是否一致,比如Cookie的domain是否正确,Session ID在主站和Wiki中是否相同。
内容的提问来源于stack exchange,提问作者Saleh Altahini




