使用 Apache 身份验证 + 授权控制对 Subversion 子目录的访问

使用 Apache 身份验证 + 授权控制对 Subversion 子目录的访问

我在 /var/svn/ 有一个 SVN 仓库,里面有几个子目录。员工必须能够访问顶级目录及其内的所有子目录,但我想使用备用 htpasswd 文件限制对子目录的访问。

这对我们的员工有用。

<Location />
DAV svn
SVNParentPath /var/svn

AuthType Basic
AuthBasicProvider ldap

# mod_authnz_ldap
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap.example.org:636/ou=people,ou=Unit,ou=Host,o=ldapsvc,dc=example,dc=org?uid?sub?(objectClass=PosixAccount)"
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off

Require ldap-group cn=staff,ou=PosixGroup,ou=Unit,ou=Host,o=ldapsvc,dc=example,dc=org
</Location>

现在,我尝试使用单独的 htpasswd 文件限制对子目录的访问,如下所示:

<Location /customerA>
DAV svn
SVNParentPath /var/svn

# mod_authn_file
AuthType Basic
AuthBasicProvider file
AuthUserFile /usr/local/etc/apache22/htpasswd.customerA
Require user customerA
</Location>

我可以使用 Firefox 和 curl 正常浏览该文件夹:

curl https://svn.example.org/customerA/ --user customerA:password

但我无法使用签出这个 SVN 存储库:

$ svn co https://svn.example.org/customerA/
svn: Repository moved permanently to 'https://svn.example.org/customerA/'; please relocate

在服务器日志中,我收到这个奇怪的错误:

# httpd-access.log
192.168.19.13 - - [03/May/2010:16:40:00 -0700] "OPTIONS /customerA HTTP/1.1" 401 401
192.168.19.13 - customerA [03/May/2010:16:40:00 -0700] "OPTIONS /customerA HTTP/1.1" 301 244

# httpd-error.log
[Mon May 03 16:40:00 2010] [error] [client 192.168.19.13] Could not fetch resource information.  [301, #0]
[Mon May 03 16:40:00 2010] [error] [client 192.168.19.13] Requests for a collection must have a trailing slash on the URI.  [301, #0]

我的问题:

  1. 我可以使用 Apache 访问控制来限制对 Subversion 子目录的访问吗?DocumentRoot 已被注释掉,因此无法确定 FAQ 中 http://subversion.apache.org/faq.html#http-301-错误 适用。
  2. 我宁愿不使用 AuthzSVNAccessFile,因为它不支持 LDAP 组。我们使用 LDAP 控制访问,并大量使用 LDAP 组。

答案1

我花了一下午的时间尝试这样做,我认为你问的问题 1 的答案是“否”。如果我尝试并查看错误日志,我会看到 PROPFIND 请求中对“/myrepo/!svn”等路径的错误:即,我认为 Subversion 客户端有时会请求仅对 Subversion 服务器模块有意义的魔术路径,而不是 Apache 可以理解和限制的“/myrepo/subdir”等路径。

然而,您使用 SVNParentPath 这一事实让我怀疑 /var/svn 实际上包含多个 Subversion 存储库,而 customerA 就是这样一个存储库。您可以通过检查是否存在文件 /var/svn/customerA/format 来判断。

是这样吗?如果是这样,您可以设置 VirtualHost 或其他位置,以便使用 SVNPath 指令仅访问 customerA 存储库。例如:

<VirtualHost>
  ServerName customerA.example.com

  <Location />
     SVNPath /var/svn/customerA
     ...
  </Location>
</VirtualHost>

相关内容