使用 authz 时 SVN 父列表返回 403

使用 authz 时 SVN 父列表返回 403

我在 svn.example.com 设置了一个 svn

我已将 SVNParentPath 设置为列出目录中的所有存储库。

当我启用我的 AuthzSVNAccessFile 时,列表页面返回 403,而我可以直接通过 svn.example.com/repo 名称正确访问存储库。

Apache 会议:

<VirtualHost *:80>
        ServerName svn.example.com

        DocumentRoot /var/www/svn

        <Location />
                DAV svn
                AuthType Basic
                AuthName "svn.example.com"
                AuthUserFile /etc/apache2/svn/users.passwd
                AuthzSVNAccessFile /etc/apache2/svn/authz
                SVNParentPath /var/svn
                SVNListParentPath on

                Require valid-user
        </Location>

</VirtualHost>

授权文件:

[groups]
admin = user1. user2, user3

[/]
@admin = rw

这是我在错误日志中看到的内容;

The URI does not contain the name of a repository.  [403, #190001]
Could not fetch resource information.  [500, #0]
Could not open the requested SVN filesystem  [500, #2]
Could not open the requested SVN filesystem  [500, #2]

访问日志

svn.example.com:80 *myIP* - user1 [18/Nov/2010:13:56:53 +0000] "GET / HTTP/1.1" 403 274 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7"

答案1

经过进一步审查,我同意 iiegn 的回答。我能够通过添加尾部斜杠和不带斜杠的别名(如文章所建议的那样)来消除 SVN 1.6.13 的问题。


先前的回应:

我在 StackOverflow 上找到了这个问题的答案https://stackoverflow.com/questions/488778/how-do-i-list-all-repositories-with-the-svnparentpath-directive-on-apachesvn,并补充称:

SVNListParentPath On

这与http://svnbook.red-bean.com/en/1.5/svn.ref.mod_dav_svn.conf.html,其中指出:

SVNListParentPath 开|关

设置为 On 时,允许 SVNParentPath 的 GET,从而列出该路径下的所有存储库。默认设置为 Off。

这应该可以解决 403 问题。

答案2

...您是否尝试过使用<Location /svn/>带有尾随 slah! 的 - :http://www.svnforum.org/2017/viewtopic.php?t=6443 人们似乎已经解决了“非根目录情况”的问题。

...那么,至少,你知道该往哪里进一步看(mod-rewrite……?)。

答案3

AuthzSVNAnonymous On
AuthzSVNNoAuthWhenAnonymousAllowed On
Satisfy Any

首先,您需要该Satisfy Any指令,如果运行组合的 open / auth repo,您​​还需要 Anonymous 行(即,我有一些包含开源和闭源的区域)。

正如我在此博客中关于升级所写:http://www.saiweb.co.uk/linux/mod_authz_svn-mod_dav_svn-prompting-for-password

验证 SVNParentPath /var/svn 路径是否存在于 /var/svn 中,并且 apache 可以使用它进行访问和写入,很有可能你把它留给了 root:rootchown -R apache:apache /var/svn

答案4

我遇到了同样的问题,并找到了以下解决方法。主要想法是不将“AuthzSVNAccessFile”应用于根目录,而是应用于其余目录。在 apache2.2(Ubuntu Server 12.04)中对我有用。

<VirtualHost *:80>
    ...
    <Location />
        ...
    </Location>
    <Location /.+>
        AuthzSVNAccessFile /path/to/the/access/file
    </Location>
</VirtualHost>

更新(完整配置):

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName svn.company.lan
    <Location />
        # Enable Subversion
        DAV svn

        # Directory containing all repository for this path
        SVNListParentPath on
        SVNParentPath /opt/subversion

        # LDAP Authentication & Authorization is final; do not check other databases
        AuthzLDAPAuthoritative on
        AuthBasicProvider ldap

        # Do basic password authentication in the clear
        AuthType Basic

        # The name of the protected area or "realm"
        AuthName "Subversion Repository"

        # The LDAP query URL
        # Format: scheme://host:port/basedn?attribute?scope?filter
        # The URL below will search for all objects recursively below the basedn 
        # and validate against the sAMAccountName attribute
        AuthLDAPURL "ldap://dc1.company.com/dc=serv,dc=company,dc=com?sAMAccountName?sub"
        AuthLDAPBindDN "CN=svn1user,OU=ou1,DC=company,DC=com"
        AuthLDAPBindPassword "PASS"

        # Require authentication for this Location
        Require valid-user
    </Location>

    # <LocationMatch /.+> is a really dirty trick to make listing of repositories work (http://d.hatena.ne.jp/shimonoakio/20080130/1201686016)
    <LocationMatch /.+>
        AuthzSVNAccessFile /opt/subversion/subversion.perm
    </LocationMatch>
</VirtualHost>

相关内容