1

我在 Red Hat Linux 机器上设置 SVN。我的场景是我在同一个目录中有两个项目:

  • /var/www/svn/proj1
  • /var/www/svn/proj2

我的 subversion.conf 有以下配置:

<Location /svn/proj1>
    DAV svn
    SVNPath /var/www/svn/proj1
    AuthzSVNAccessFile /etc/svn_proj1-acl-conf
    AuthType Basic
    AuthName "Subversion repos"
    AuthUserFile /etc/svn-auth-conf
    Require valid-user
</Location>

<Location /svn/proj2/>
    DAV svn
    SVNParentPath /var/www/svn/proj2
    SVNListParentPath on
    AuthzSVNAccessFile /etc/svn_proj2-acl-conf
    AuthType Basic
    AuthName "Subversion repos"
    AuthUserFile /etc/svn-auth-conf
    Require valid-user
</Location>

对于 project1 我的 URL http://www.example.com/svn/proj1工作得很好,但是对于 project2 我需要在 URL 的末尾添加斜杠http://www.example.com/svn/proj2/否则它不会返回用户/密码窗口。

如果我从位置指令中删除尾部斜杠,

<Location /svn/proj2>

然后它开始给出403 Forbidden错误,无论我是否在浏览器中使用斜线。

我将它与 TortoiseSVN 一起使用,但 project2 根本不起作用。

我应该在配置中查看什么?

4

2 回答 2

1

使困惑。使困惑。使困惑...

但是,我很容易混淆...

你有两个项目。您使用的第一个:

SVNPath /var/www/svn/proj1

以及您使用的第二个:

SVNParentPath /var/www/svn/proj2

为什么是一个SVNPath和另一个SVNParentPath?有区别。您指定SVNPath何时引用特定存储库。SVNParentPath当您引用包含多个存储库的目录时使用。

那么,您的设置到底是什么?我有一种感觉,他们都应该是SVNPath

顺便说一句,我注意到你有相同的用户列表,但不同的AuthzSVNAccessFile访问文件。你只是阻止人们提交,还是阻止人们阅读特定的文件和目录?

通常的做法是允许用户查看所有文件,但阻止提交访问。在这种情况下,您可能希望在 Apache httpd 之外使用我的pre-commit hook来执行此操作。这允许您做两件事:

  • 关闭加速 Subversion 的目录检查访问。
  • 在不重新启动 Apache httpd 的情况下更改提交权限。

然后,您可以在一个配置中配置这两个目录:

<Location /svn>
    DAV svn
    SVNParentPath /var/www/svn
    SVNListParentPath on
    AuthType Basic
    AuthName "Subversion repos"
    AuthUserFile /etc/svn-auth-conf
    SVNPathAuthz off
    Require valid-user
</Location>

当然,如果您使用 AuthzPath 来阻止读取访问,则必须使用该AuthzSVNAccessFile参数。但是,它会使事情变得更复杂,并且会减慢您的速度。我通常不建议使用它,除非用户不应该能够查看彼此的存储库(这非常罕见)。

而且,还有一件事……您的用户有 LDAP 或 Windows Active Directory 帐户吗?如果是这样,您可以使用来确定 Subversion 存储库访问权限:

 LoadModule authnz_ldap_module   modules/authnz_ldap.so

 <Location /svn>
    DAV svn
    SVNParentPath /var/www/svn
        SVNListParentPath on
    AuthType basic
    AuthName "Subversion Repository"
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative off
    AuthLDAPURL "ldap://windomain.mycorp.com:3268/dc=mycorp,dc=com?sAMAccountName" NONE
    AuthLDAPBindDN "CN=svn_user,OU=Users,DC=mycorp,DC=com"
    AuthLDAPBindPassword "swordfish"
    Require ldap-group CN=developers,CN=Users,DC=mycorp,DC=com
</Location>

这样,如果用户拥有 Windows 帐户(或在您的 LDAP 数据库中),并且该用户在开发人员组中,他们将自动有权访问您的 Subversion 存储库(请注意存储库SVNParentPath和任何未来的存储库)。这样,您就不会不断地在 SVN 授权文件中添加和减去用户。另外,您不会经常找回忘记的密码。

现在,这就是您的 Windows 管理员的全部责任。这是魔法。我让你的任务成为他们的工作。用户没有 Subversion 访问权限?不再是你的问题。有更多时间玩愤怒的小鸟。

还有一件小事:我感觉您不想将存储库放在下面/var/www,原因很简单,可能是您的文档根目录。如果您不小心,您可能会授予对 Subversion 存储库目录的直接访问权限。

你最好把它们放在别处并改变SVNParentPath.

于 2012-05-18T02:06:48.987 回答
0

Locationand指令应该有相同的SVNParentPath斜杠规则:有或没有。

所以应该是:

<Location /svn/proj2/>            <--- Here trailing slash (or not)
    [..]
    SVNPath /var/www/svn/proj2/  <--- Here same like Location
    [...]
</Location>
于 2012-05-17T22:18:21.513 回答