本文已获得原始位置 http://blogs.collab.net/subversion/authz_and_anon_ 的许可,并镜像在此。失效链接已删除或更新。
作者:C. Michael Pilato
发布 2007-03-22
最近第一次尝试使用 Subversion 的基于路径的授权模块,结果比我预期的要复杂,因为我试图将其与允许匿名读取访问的存储库一起使用。最初一切顺利——我从 版本控制与 Subversion 中复制粘贴了一些示例 httpd.conf 指令和 authz 文件内容,并根据需要进行调整以满足我的需求。很快,我便认为自己已经完成了完美的设置。我错了。
假设,像我一样,您希望配置一个存储库,使其允许匿名用户读取大部分内容,允许已认证用户读取其余内容,并允许已认证用户写入整个存储库。您已经拥有一个包含您的编写者用户名和密码哈希值的 Apache htpasswd 文件,并且您已经配置 Apache 使用该 htpasswd 文件进行身份验证,并使用 authz 文件进行授权。然后,您对 authz 文件进行显而易见的添加
[groups] writers = someuser1, someuser2, … [repository:/] * = r @writers = rw [repository:/trunk/private-area] * = @writers = rw
有一个包含您的编写者用户名的组。有一个规则允许匿名用户读取整个存储库,并允许仅编写者写入。还有一个覆盖规则,它从存储库的私有区域中删除未经身份验证用户的读取访问权限。看起来很棒。
然后您开始测试。
在检出存储库的 /trunk 目录时,匿名用户会得到您预期的结果——树,减去 /trunk/private-area 目录。
但是,你的经过身份验证的潜在作者呢?啊,这就是问题所在!根本没有经过身份验证的用户。由于匿名用户可以检出树,Apache 从未费心向你查询身份验证凭据。而且你无法强制 Subversion 在 Apache 未要求的情况下传输身份验证凭据。
那么,有什么解决方法呢?
首先,你可以完全禁用匿名访问,并强制非作者共享一个用户名,例如“anonymous”,以及一个公开的密码。在你的 authz 规则中,用户“anonymous”只拥有读取权限,并且只对存储库的公共部分拥有读取权限。这可以正常工作,但对非作者来说有些不便。他们现在必须提供一个密码,虽然不是秘密,但可能仍然不明显或他们不知道。
其次,你可以保持现状,并强制作者单独检出存储库的私有区域。他们将无法享受将公共区域和私有区域连接到单个工作副本中的便利,但这可能没问题。
第三,你可以将私有内容保存在自己的存储库中。对于作者来说,这与第二种解决方法非常相似。但你的作者无法在不破坏跨存储库的历史记录的情况下将私有内容公开。
最后,你可以在你的 <Location> 文件中设置第二个 httpd.conf 块,该块指向同一个存储库,但 URL 略有不同(例如,在 URL 后面添加“-no-anon”)。在这个块中,禁止匿名访问。然后,在你的 authz 文件中添加一个匹配的冗余条目。
[repository-no-anon:/] * = @writers = rw
现在,匿名非作者可以从原始存储库 URL 检出,无需提示,并且不会看到私有区域。非匿名作者可以从备用存储库 URL 检出,并会收到提示,并且会看到私有区域。(感谢 Max Bowsher 提供了这个很棒的混合解决方法)。
C. Michael Pilato 是 Subversion 的核心开发者,版本控制与 Subversion(O'Reilly Media)的合著者,以及 ViewVC 的主要维护者。他作为 CollabNet 的软件工程师,从他的家乡北卡罗来纳州远程工作,并且从 2001 年初开始就是一名活跃的开源开发者。Mike 是一位自豪的丈夫和父亲,他热爱旅行、足球、与家人共度美好时光,以及这些事情的任何组合。他还喜欢作曲和表演音乐,并怀有对摇滚明星的秘密幻想。Mike 拥有北卡罗来纳大学夏洛特分校的计算机科学和数学学位。