Mediawiki 个人 Wiki 设置 Namespace 权限控制

2018/10/24 posted in  日常折腾

以本站wiki为例,这个站点是一个私有的 wiki,这意味着绝大多数的词条和页面我并不想公开。但是呢,我还有一些博客文章,是想公开的。为此我研究过 MediaWiki 的访问权限机制,发现要实现我想的那样很困难很麻烦。昨天发现的这个扩展 NamespaceReadRestrict 部分解决了我的问题。NamespaceReadRestrict 这个扩展的功能就是设置某一个 Namespace(命名空间)为公开的或私有的,这样,设置 Blog 为公开,就可以将以 Blog: 标题开头的页面全部公开了。下面是具体的使用方法:

安装

下载 文件,并解压放到 extensions/ 的 NamespaceReadRestrict 目录下面。
在 LocalSettings.php 文件末尾添加下面一行:

 require_once "$IP/extensions/NamespaceReadRestrict/NamespaceReadRestrict.php";

完成之后,打开 Special:Version 页面,如果看到该扩展就说明安装成功了。

配置

根据 Manual:Preventing access 中的说明,要禁止所有未登录用户的阅读,编辑和创建账号的权限。然后在 LocalSettings.php 文件中 初始化 wgWhitelistRead 数组,代码如下所示:

$wgGroupPermissions['*']['read'] = false;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createaccount'] = false;
$wgWhitelistRead = array(
    'MediaWiki:Common.css',
    '-',
    'Main Page'
);

如果 wiki 的大部分内容是私有的

在上面的 require_once 后面添加下面的代码,以允许某些命名空间被未登录用户阅读:

define("NS_PUBLIC", 500);
define("NS_PUBLIC_TALK", 501);
$wgExtraNamespaces[NS_PUBLIC] = "Public";
$wgExtraNamespaces[NS_PUBLIC_TALK] = "Public_talk";   # underscore required
$wgAllowedReadNamespaces = array (
        NS_PUBLIC,
        NS_PUBLIC_TALK
);

如果 wiki 的大部分内容是公开的

如果 wiki 的大部分内容是公开的,那么你可能想让某些命名空间变成私有比如 Private: ,只允许自己访问

define("NS_PRIVATE", 500);
define("NS_PRIVATE_TALK", 501);
$wgExtraNamespaces[NS_PRIVATE] = "Private";
$wgExtraNamespaces[NS_PRIVATE_TALK] = "Private_talk";   # underscore required
$wgPrivateNamespaces = array (
        NS_PRIVATE,
        NS_PRIVATE_TALK
);
$wgAllowedReadNamespaces = array_diff ( array_merge ( range ( -2, 15 ),
        $wgExtraNamespaces ), $wgPrivateNamespaces);
$wgNonincludableNamespaces = array_merge ( $wgNonincludableNamespaces, $wgPrivateNamespaces );

问题

  1. 注意在定义命名空间数字常量时一定要大于3000,且必须是偶数,因为偶数是主词条,而奇数是主词条对应的 主词条:Talk 页面。

  2. 公开的命名空间如果之前已经有了某些页面,这些页面都会变得不可见,需要重新创建。我猜原因可能是不同的权限对应的实际上是不同的页面,即使他们的词条名称都一样。

参考:Extension:NamespaceReadRestrict - MediaWiki