我使用 mod_svn_dav 在 Apache2 后面维护一组 SVN 存储库,并使用 pwauth 来验证用户(使用 mod_authnz_external)。我为有效用户和组 svn 设置了 Require 指令。这对我来说非常有效,但现在有必要引入更细粒度的权限 - 即仅允许特定用户访问特定存储库。据我所知,实现此目的的最佳(最简单)方法是使用内置的 authz 功能,通过将 AuthzSVNAccessFile 设置为列出谁可以访问什么的文件。这就是我打算做的事情。我当前的站点配置如下所示(为清晰起见,删除了日志配置等):
<VirtualHost *:81>
<Location />
allow from 127.0.0.1
DAV svn
SVNParentPath /var/svn
SVNListParentPath On
AuthType Basic
AuthName "SVN repository"
AuthBasicProvider external
AuthExternal pwauth
AuthzSVNAccessFile /var/svn/dav_authz
Require valid-user
Require group svn
</Location>
<IfModule mod_authnz_external.c>
AddExternalAuth pwauth /usr/sbin/pwauth
SetExternalAuthMethod pwauth pipe
</IfModule>
</VirtualHost>
旁注:是的,*:81 - 我实际上已经在 nginx 和 svn.mydomain.com 代理后面运行它,并通过它在端口 81 上运行。
dav_authz 如下所示:
[/]
myuser = rw
* =
[RepoOne:/]
myuser = rw
* =
[RepoTwo:/]
mysuser = rw
someone = rw
* =
我期望这将使“myuser”拥有对所有内容的读/写访问权限,“someone”仅拥有对 RepoTwo 的读/写访问权限,而其他所有人都会被礼貌地告知滚开(即使他们是有效用户并属于 svn 组)。但事实并非如此。无论我怎么尝试,除了服务器给出一个糟糕的 403 错误之外,我什么也得不到。如果我恢复为不使用 AuthzSVNAccessFile,该错误就会消失,我可以再次正常登录(如果用户有效并属于 svn 组)。我尝试了不同顺序的指令(例如,将 [/] 放在最后)、不同格式的用户名(someuser、someuser@system、someuser/system、someuser\system)、删除 repo 配置并只保留 [/] 规则、将 [/] 规则设置为 * = rw、甚至完全清空文件、将 dav_authz 的所有权授予 www-data 等等,等等,等等 - 每次在更改之间重新启动 Apache - 每次都得到相同的 403。Apache 日志显示 myuser 正在访问该网站,而 403 响应、错误日志除了我的 Apache 重新启动之外没有显示任何其他内容。
我没什么主意,需要帮助!你能帮我吗?
JS
答案1
一些注释(来自基于路径的授权SVNBook章节):
- 限制从父母继承到孩子
- 没有提及用户意味着“无权访问”
即,您只能在根目录中添加用户,并在其中重新定义访问级别。这样,我将尝试类似
[/]
myuser = rw
[RepoTwo:/]
someone = rw
无关:出于可读性和可管理性方面的考虑,我更喜欢按 AuthzSVNAccessFile 部分内的组进行操作,而不是按用户进行操作,即使组在某些时候是单个用户