MediaWiki权限控制需求:组内成员仅可编辑本组创建的页面
实现MediaWiki组内页面编辑权限控制方案
核心思路
要实现「某组成员仅能编辑该组成员创建的页面,且无法编辑未加入组的成员创建的页面」,需要结合MediaWiki的组权限配置和自定义权限判断逻辑,通过钩子实现自动化的权限校验。
步骤1:创建并配置基础用户组
首先在LocalSettings.php中定义目标用户组,同时收回普通用户的全局编辑权限,为后续精细化控制做准备:
# 创建自定义用户组 $wgGroupPermissions['GroupA']['createaccount'] = false; $wgGroupPermissions['GroupB']['createaccount'] = false; # 收回普通用户的默认编辑权限,后续仅开放给指定组的关联页面 $wgGroupPermissions['user']['edit'] = false; # 允许各组成员创建页面(按需调整) $wgGroupPermissions['GroupA']['createpage'] = true; $wgGroupPermissions['GroupB']['createpage'] = true;
步骤2:通过钩子实现自动权限校验
利用MediaWiki的getUserPermissionsErrors钩子,在用户尝试编辑页面时,自动校验当前用户与页面创建者是否属于同一组,不一致则拒绝编辑。将以下代码添加到LocalSettings.php中:
$wgHooks['getUserPermissionsErrors'][] = 'checkGroupPageEditPermission'; function checkGroupPageEditPermission( $title, $user, $action, &$errors ) { // 仅处理编辑动作 if ( $action !== 'edit' ) { return true; } // 获取页面创建者信息 $page = WikiPage::factory( $title ); $creator = $page->getCreator(); if ( !$creator ) { // 无明确创建者的页面(如系统页面),可根据需求调整权限逻辑 return true; } // 对比当前用户与创建者的组交集 $userGroups = $user->getGroups(); $creatorGroups = $creator->getGroups(); $sharedGroups = array_intersect( $userGroups, $creatorGroups ); if ( empty( $sharedGroups ) ) { // 无共享组,拒绝编辑并提示 $errors[] = array( 'permissiondenied', '您只能编辑与您同组成员创建的页面' ); return false; } return true; }
补充说明
- 若需要让组管理员拥有组内所有页面的编辑权限,可在钩子函数中添加额外判断,比如校验用户是否属于组管理员组。
- 系统命名空间(如
MediaWiki:)下的页面,可单独在LocalSettings.php中配置权限,避免被上述规则限制。 - 若Wiki用户量较大,建议将钩子逻辑封装为独立扩展,便于维护和升级。
内容的提问来源于stack exchange,提问作者sube singh
相关产品推荐
相关产品推荐

