我正在尝试配置通过 Apache 2 访问的 SVN 存储库的权限。我希望允许任何人访问根目录,同时限制经过身份验证的用户访问子目录。示例:
/demo
/demo/project1
/demo/project1/sensitive-data # This path should require user authentication.
/demo/project2
起初,我以为这很简单:
<Location /demo>
DAV svn
SVNPath /home/svn/demo
AuthType Basic
AuthName demo
AuthUserFile /etc/subversion/passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
<Location /demo/project1/sensitive-data>
DAV svn
Require valid-user
</Location>
通过 HTTP 使用时(例如使用 CURL),Apache 符合以下配置:我可以访问:
HTTP 401 Unauthorized
正如预期的那样,当我尝试检索时,我得到了http://example.com/demo/project1/sensitive-data。
另一方面,这样做:
svn checkout http://example.com/demo/ .
或者:svn checkout http://example.com/demo/project1/ .
检索整个目录树,包括demo/project1/sensitive-data
。
至少,svn checkout http://example.com/demo/project1/sensitive-data/ .
要求输入密码。
我应该如何配置权限来限制对sensitive-data
目录的访问svn checkout http://example.com/demo/ .
?
答案1
该<Location /demo/project1/sensitive-data>
块在进行结帐时无关紧要:它仅在访问时使用http://example.com/demo/project1/sensitive-dataHTTP 401 Unauthorized
直接,这就是为什么 HTTP 请求会导致并且检出这个特定目录需要身份验证的原因。
配置基于路径的授权的正确方法是Subversion 文档中有解释:
<Location /demo>
指向访问文件:<Location /demo> ... AuthzSVNAccessFile /etc/subversion/access.conf ... </Location>
访问文件定义谁可以访问特定文件和目录。基本示例:
[/] * = r # Everyone should be able to access the repository. [/demo/project1/sensitive-data] # Note that there is no trailing slash. * = # Nobody should access the sensitive directory.