谢谢大家的建议!我最终使用了全局 ipblocks 表和Extension:Lockout来阻止用户登录,从而有效地禁用了他们的帐户。我在 LocalSettings.php 文件中为全局用户设置了共享表和共享数据库:
$wgSharedDB = 'up_commonusers';
$wgSharedTables = array( 'user', 'user_groups', 'account_requests', 'account_credentials', 'ipblocks');
我计划使用以下列表根据用户名管理被阻止的帐户:Special:BlockList。这个列表的缺点是它没有用户的主页 wiki,所以我在 ipblocks 表中添加了一个“ipb_user_home”列,以便稍后使用这个钩子作为参考:
$wgHooks['BlockIpComplete'][] = 'addHomeWikiData';
function addHomeWikiData(&$block, &$user){
$userId = $block->getTarget() instanceof User ? $block->getTarget()->getID() : 0;
if($userId>0){
$dbw = wfGetDB(DB_MASTER);
$row = $dbw->selectRow('user', '*', array('user_id'=>$userId));
$dbw->begin();
$dbw->update('ipblocks', array('ipb_user_home'=>$row->user_home), array('ipb_user'=>$userId));
$dbw->commit();
return true;
}
return false;
}
将来我最终会编写自己的阻止列表表,它将使用此信息,但现在我有我需要的东西。
所以工作流程非常简单。我使用普通的 Special:Block 页面来阻止用户。被阻止的用户被添加到全局 ipblocks 表而不是本地表,因为我们配置了一个 SharedTable,然后它使用钩子添加他们的主页 wiki 数据。Lockout 扩展在登录时使用了不同的钩子,它将检测用户是否被阻止并抛出错误消息。弹出错误,您无法登录。
希望这可以帮助!