为mediawiki添加页面黑名单功能
xtykc 09月 27th, 2009
因为wiki本来是秉承开发思想的,因而相比于drupal来说,在用户管理和权限控制方面就弱了很多。但也有基本的权限控制,但都要到配置文档Localsettings.php里面去设置,相比于drupal的完全基于web管理来说,实在是太不爽了。
mediawiki本身具备了白名单的功能,所谓的白名单,只是针对匿名用户的,如果你的wiki网站不希望匿名用户看到大部分内容,只允许看到少量指定的内容,那么就可以把允许匿名用户看到的页面加入到白名单中去。加入白名单的方法是:
先禁止匿名用户访问所有内容,在Localsettings.php中加入:
$wgGroupPermissions['*']['read'] = false;
再在白名单中加入允许匿名用户看到的页面,在Localsettings.php中加入:
$wgWhitelistRead = array (urldecode(”%E9%A6%96%E9%A1%B5″), “Special:Userlogin”, “Wikipedia:Help”);
注意,如果页面名称是中文的,就要用类似”%E9%A6%96%E9%A1%B5″这样的字符串代替,可打开页面后,从浏览器地址栏拷贝。
但如果想让匿名用户看到大部分的页面,而只有小部分的页面需要登录才能看到的话,就需要黑名单的功能。可惜mediawiki本身没有这个功能,但因为黑名单的功能与白名单的功能在逻辑上是相反的,只要找到实现白名单的那个函数,扩展黑名单功能也非难事。
用$wgBlacklistRead在google上搜一下,就会发现已经有人扩展了这个功能,提供了下面这个patch文档:
— ./includes/Title.php.orig 2006-06-12 18:04:36.902437448 +0200 +++ ./includes/Title.php 2006-06-12 18:16:32.427661080 +0200 @@ -999,6 +999,15 @@ global $wgUser; if( $wgUser->isAllowed(’read’) ) { + global $wgBlacklistRead; + + /** some pages are explicitly disallowed for + anonymous users */ + $name = $this->getPrefixedText(); + if( !$wgUser->isLoggedIn() && $wgBlacklistRead && in_arr ay( $name, $wgBlacklistRead ) ) { + return false; + } + return true; } else { global $wgWhitelistRead; — ./includes/DefaultSettings.php.orig 2006-06-12 17:42:23.769104520 +0200 +++ ./includes/DefaultSettings.php 2006-06-12 17:43:22.753137584 +0200 @@ -702,6 +702,7 @@ # own risks. $wgWhitelistRead = false; # Pages anonymous user may see, like: = array ( “Main Page”, “Special:Userlogin”, “Wikipedia:Help”); +$wgBlacklistRead = false; # Pages anonymous user may not see (set as above) $wgAllowAnonymousMinor = false; # Allow anonymous users to mark changes as ‘minor’
仔细看,原来是在实现白名单的那个funcion中,加上了一些代码。在wiki根目录下的includes目录下,打开Title.php,找到userCanRead()这个方法,在
if( $wgUser->isAllowed(’read’) ) { 和 return true; 之间下面添加上述文档中前面带“+”符号的代码。 这样就可以在LocalSettings.php中设置: $wgBlacklistRead = array (urldecode(”%E4%B8%8A%E5%9B%BE%E4%BA%BA%E5%91%98%E5%8F%8A%E9%83%A8%E9%97%A8%E5%88%86%E5%B8%83%E6%A6%82%E8%A6%81″));