我正在使用 Apache 2.4,并且希望在没有 mod_access_compat 的情况下使用它。
我正在尝试提供 SVN 存储库,并由 mod_authz_svn 处理访问控制。
我希望某些存储库或存储库内的位置具有只读匿名访问权限。我希望其他存储库或位置需要基本身份验证。
Apache 2.4 不再支持该Satisfy all
语法,但是 mod_authz_svn 似乎需要它。在 Apache 2.4 上应该如何配置?
Apache 配置:
<Location /svn>
DAV svn
SVNParentPath /usr/projects/svn
AuthType Basic
AuthName "SVN repository"
AuthUserFile /usr/project-config/etc/svn-auth-file
AuthzSVNAccessFile /usr/project-config/etc/svn-access-control
Require valid-user
</Location>
svn-访问控制:
# cat etc/svn-access-control
[/]
antiduh = rw
[openprojects:/]
* = r
antiduh = rw
我有 5 个仓库,openprojects 是唯一一个我想拥有匿名只读访问权限的仓库。我似乎无法让它工作。即使是我能找到的最新文档对于 mod_authz_svn 继续使用Satisfy all
。
答案1
在 mod_authz_svn 的源代码中查找,它似乎对 有很强的依赖性ap_satisfies(r) == SATISFY_ANY
。我并不完全熟悉 Apache API 模型,但这似乎表明 mod_authz_svn 目前不支持 Apache 2.4 的新身份验证模型。
由于没有其他人提出答案或相反的证据,我将把它标记为答案。
为了使其在 Apache 2.4 下工作,请加载mod_access_compat
模块:
LoadModule access_compat_module libexec/apache24/mod_access_compat.so
然后添加Satisfy any
子句,正如文档当前所示。
<Location /svn>
DAV svn
SVNParentPath /usr/home/antiduh/svn
AuthType Basic
AuthName "SVN repository"
AuthUserFile /usr/home/antiduh/svn/etc/svn-auth-file
AuthzSVNAccessFile /usr/home/antiduh/svn/etc/svn-access-control
Satisfy any
Require valid-user
</Location>
答案2
在大多数情况下,2.4 的等效方法Satisfy All
是将Require
指令包含在<RequireAll>
块。相当于Satisfy Any
是一个<RequireAny>
块。
有关变更和等效变更的更多信息,本演示文稿 (PDF)Rich Bowen 的这篇文章可能会有所帮助。
答案3
可以Location
为 SVN 协议命令的子集创建单独的无需身份验证的命令,例如:
<Location /subversion-open>
DAV svn
SVNParentPath /path/to/svn-repos/subversion-open
SVNListParentPath Off
SVNReposName "SVN repos"
AuthzSVNAccessFile /path/to/svn-authz-file
# Limit write permission to list of valid users.
<LimitExcept GET PROPFIND OPTIONS REPORT>
AuthType Basic
AuthBasicProvider file PAM
AuthUserFile /path/to/svn-htpasswd-file
AuthPAMService httpd_svn
AuthName "Open access SVN repos"
Require valid-user
</LimitExcept>
</Location>
这样未经身份验证的用户就可以读取存储库,而经过身份验证的用户则可以根据规则获得访问权限svn-authz-file
。(在此示例中,我们还允许系统用户以及htpasswd
文件中的用户通过 PAM 进行身份验证)