具有外部用户访问控制的MediaWiki文档

时间:2009-04-02 12:11:37

标签: security mediawiki wiki

我们正在使用MediaWiki inhouse来获取我们的软件和硬件文档。对于我们的外部用户 - 客户,项目合作伙伴 - 来说,授予/撤销对部分文档的“读取权限”并不容易实现。我们如何根据用户或角色访问权限控制对文档某些区域的读访问权?

编辑:我问这个是因为我不想回到文档的“旧式” - 将Office文档存储在几十个不同的位置,没有人知道他们在哪里是。因此,如果没有办法让用户只能访问他们的产品信息,我担心管理层会放弃整个MediaWiki解决方案并引入“新的更好”的东西。 (这可能意味着我们必须将所有内容转移到新系统,格式和超链接将丢失等......)。


非常感谢您的评论和答案!

http://meta.wikimedia.org/wiki/Access_control

提供了一些有趣的信息

例如,有一个HiddenWiki补丁似乎正在积极开发中,位于http://sourceforge.net/projects/hiddenwiki/

8 个答案:

答案 0 :(得分:3)

MediaWiki并非真正用于禁止注册用户查看网页。我不认为你可以在没有一些痛苦的情况下做到这一点。

来自documentation(重新格式化):

让一个页面对某些用户起作用,但对其他用户不可见,例如在大多数论坛软件中,这是一个非常不同的事情。 MediaWiki专为两种基本访问模式而设计:

  • 每个人都可以查看维基上的每个页面(可能除了一些特殊页面)。这是维基百科及其姐妹项目使用的模式。
  • 匿名用户只能查看主页面和登录页面,不能编辑任何页面。这在技术实现方面基本上与上述相同(只是对每个页面视图进行额外检查),这就是它存在的原因。这是某些私人维基使用的操作模式,例如各种维基媒体委员会使用的维基。

我的学校以您想要的方式使用wiki。我的一个朋友把他们安排好了。他不得不广泛地破解软件以使其发挥作用。根据我在MediaWiki中挖掘的经验,您可以在这里度过一段愉快的时光。

您有四个选项

  • 获取MediaWiki插件并进行升级以打破它。
  • 自己破解并在每次升级时重做工作。
  • 使用不同的wiki软件。
  • 如上所述设置新的私人wiki。

答案 1 :(得分:1)

正如其他人所指出的,这不是MediaWiki的核心功能。

最简单的解决方案可能是拥有带有Wiki间链接的公共和私有wiki。 (首先复制原始wiki并从公共安装中删除不需要的页面,然后添加重定向)。

另一种可能性是为公共和私有页面设置单独的命名空间,并根据配置文件中的命名空间限制可访问性。

答案 2 :(得分:1)

这听起来好像你正试图将MediaWiki放在不一定要去的地方,所以我建议选择一个更好的工具

随着wiki的发展,我们经历了一个MediaWiki阶段,但最终选择MindTouch Deki,因为它看起来更好,行为更好,而且更易于管理(对于访问控制等)。你可以在他们的网站上找到所有细节,我可以说它开箱即用。

这是好的部分:现在有一个MediaWiki to Deki converter可用。我不能保证它(新的和所有的),但由于所有部件都是免费的,我的建议是你花几个小时试着看看你能做些什么,你可能只是喜欢结果。

答案 3 :(得分:0)

您可以使用网页访问限制扩展程序:http://www.mediawiki.org/wiki/Extension:Page_access_restriction和分组来执行此操作。

话虽如此,MediaWiki doesn't recommend you do it...

(从my answer to Stack Overflow question MediaWiki payment gateway被盗。)

答案 4 :(得分:0)

您可以创建MediaWiki Namespaces并将特定用户分配给特定的命名空间。您必须要小心,但是在没有编辑LocalSettings.php文件的情况下,新站点名称中的页面默认情况下不会显示在站点上的搜索中。有关详细信息,请参阅the documentation

请参阅此semi-related thread

答案 5 :(得分:0)

如果您将页面命名为X/Y,则链接将为wiki/X/Y,这意味着您可以在任何良好的代理中设置访问权限,例如基于“目录”的Apache HTTP。您可以将代理连接到Windows域或只是用户名列表。

答案 6 :(得分:0)

这是我的解决方案。

我们将wiki保留在.htpasswd后面,并且子域(external.wiki.mydomain.co.uk)上的php脚本获取页面并提供如果它与允许的页面数组匹配

它还会删除侧边栏和页脚等。这可能取决于你的wiki使用的样式,strip_content()函数可能需要调整。

    $allowed = array(   "Architecture",
                        "Database_Design",
                        "Authentication",
                        "Branding");

    //put your own .htpasswd credentials in here
    $username = "USERNAME";
    $password = "P@ssw)rd";
    $url = "http://internal.wiki.mydomain.co.uk";

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    $output = curl_exec($ch);

    //I have not mod-rewritten the index.php out of the url, hence the 2 lines below...
    $page = str_replace("/index.php/", "",$_SERVER['PHP_SELF']);
    $page = $page == '/index.php' ? "Home" : $page;

    $links = "<div><a href = '/' >Home</a>";
    $links .= isset($_SERVER['HTTP_REFERER']) ? '&nbsp;-&nbsp;<a href = "' . $_SERVER['HTTP_REFERER'] . '" >Back</a>' : '';
    $links .= "</div>";
    if (!in_array($page, $allowed)) {
        $out = "<div>Access denied to " . $page . '</div>' . $links;
    } else {
        curl_setopt($ch, CURLOPT_URL, $url . "/index.php/" . $page);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        $out = $links . '<br />' . strip_content($output);
    }
    curl_close($ch);
    echo $out;

    /**
     * Strip out unwanted bits of the page, such as side bar and header and footer.
     * @param string $html The raw html
     * @return string
     */
    function strip_content($html)
    {
        $patterns = array(  '!<span class="editsection">.*?<\/span>!is',
                             '@<!-- footer -->.*?<!-- /footer -->@is',
                            '@<!-- panel -->.*?<!-- /panel -->@is',
                            '@<!-- header -->.*?<!-- /header -->@is'

            );
        return preg_replace($patterns, "", $html);
    }

您可以通过在开头添加登录来扩展此功能,以便脚本可以为不同的用户选择不同的页面子集。

答案 7 :(得分:0)

如果您有私人wiki,则可以使用LocalSettings.php中的标记$wgBlockDisablesLogin = true来禁用被阻止用户的登录功能(然后阻止某人撤销所有访问权限)。另一种选择是将整个wiki放在vpn后面。

参考文献: