我在 /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]
我的问题:
- 我可以使用 Apache 访问控制来限制对 Subversion 子目录的访问吗?DocumentRoot 已被注释掉,因此无法确定 FAQ 中 http://subversion.apache.org/faq.html#http-301-错误 适用。
- 我宁愿不使用 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>