【问题标题】:Allow SVN anonymous read access from localhost允许来自本地主机的 SVN 匿名读取访问
【发布时间】:2012-03-05 00:08:00
【问题描述】:

我有一个 SVN 存储库,它被配置为通过 Apache httpd 使用基本身份验证来限制对指定用户的访问。为了支持在同一台服务器上运行的持续集成服务器(和其他只读服务),我想允许来自 localhost 的匿名读取访问。

在进行了一些研究(即谷歌搜索)后,我想出了尝试以下 Apache 配置:

<Location /svn>
   DAV svn
   SVNParentPath /var/svn

   AuthType Basic
   AuthName "SVN"
   AuthBasicProvider external
   AuthExternal pwauth

   #Only allow specified users to login to SVN
   require user UID1
   require user UID2
   require user UID3

   #Allow anonymous reads from localhost
   <LimitExcept GET PROPFIND OPTIONS REPORT>
      Order allow,deny
      Allow from 127.0.0.1
   </LimitExcept>
</Location>

当我尝试从本地服务器进行匿名结帐时,我仍然会收到提示输入密码(在本例中为 root 用户)。

关于我可能做错了什么或我应该如何正确配置以允许这样做的任何想法或建议?

我最初尝试配置匿名读取访问权限是基于this 页面上的信息。

【问题讨论】:

  • 查看您的 Apache 日志以了解它认为您来自哪个 IP。如果启用 IPv6,您可能需要添加 Allow from ::1
  • ssl_access_log 中的请求显示它来自我指定的 127.0.0.1:127.0.0.1 - - [13/Feb/2012:10:38:40 -0500] "OPTIONS /svn/myRepo

标签: svn apache httpd.conf mod-dav-svn


【解决方案1】:

如果您有多个 Require 行,默认情况下它是 RequireAny - 只需要通过一个规则。所以你可以这样做

   Require user UID1 UID2 UID3

   #Allow anonymous reads from localhost
   <LimitExcept GET PROPFIND OPTIONS REPORT>
     Require ip 127.0.0.1
   </LimitExcept>

【讨论】:

    【解决方案2】:

    即使是我也无法解决匿名访问问题。

    但是,我没有创建新的只读用户,而是通过使用基于文件的 url 使集成(与 redmine)工作。因此,我没有引用 http url(需要身份验证),而是使用 file:///。这不需要身份验证。

    【讨论】:

      【解决方案3】:

      我从来没有找到一个解决方案,它只允许从本地主机进行匿名读取访问,并且需要对来自任何远程系统的读取和写入进行身份验证。

      最终我为需要验证的应用程序创建了一个用户名/密码。

      这不是理想的解决方案...但它应该可以正常工作。

      【讨论】:

        【解决方案4】:
          Satisfy Any
          require valid-user
        

        很好地为我工作(可以结帐,不能提交)

        编辑

        我的块,有相关和不相关的部分

        <Location /svn/>
          DAV svn
        
          SVNListParentPath on
          SVNParentPath "D:/Repositories/"
          SVNIndexXSLT "/svnindex.xsl"
        
          SVNPathAuthz short_circuit
        
          SVNCacheTextDeltas off
          SVNCacheFullTexts off
        
          AuthName "VisualSVN Server"
          AuthType Basic
          AuthBasicProvider file
          AuthUserFile "D:/Repositories/htpasswd"
          AuthzSVNAccessFile "D:/Repositories/authz"
        
          Satisfy Any
          require valid-user
        
          # Add Expires/Cache-Control header explictly
          ExpiresActive on
          ExpiresDefault access
        </Location>
        

        如果我跳过Satisfy Any,我必须验证任何请求

        【讨论】:

        • 您是否真的要让它在不指定用户 ID 的情况下匿名结帐的地方工作?
        • @Michael - 在my local SVN,你可以尝试从任何宣布的回购中结帐提交
        • 很遗憾,我无法在工作中试用您的 URL(由于网络安全限制)。但是我试过了,但我无法让你描述的东西为自己工作。您如何在配置中指定 require valid-user 部分以将异常限制为只读?
        • @Michael - 没什么特别的。我将我的位置添加到答案的编辑部分(完整位置)
        • 虽然可行(使用AuthzSVNAccessFile),但它不允许我将匿名连接限制为仅来自本地主机。看起来我将不得不继续并放弃并创建一个帐户,仅供我的 CI 服务器使用。不过感谢您的帮助! :)
        【解决方案5】:

        我认为这行不通 “需要用户”指令对整个位置块都有效。

        我的第一个想法是将“需要用户”放在限制块内,这不起作用,因为无论您从哪个 IP 请求数据,限制块都是活动的。

        创建一个名为 svn-localhost 的第二个目录,第二次映射你的 svn 根目录,只存在限制块。

        【讨论】:

        • 我也想过这个。不幸的是,我们的 svn:externals 将使用这种方法被破坏,因为它们都指向 /svn,这需要身份验证。
        • hmmm,好吧,这个怎么样:分别收听 127.0.0.1 和您的公共 IP,然后定义 2 个虚拟主机,一个用于公共 IP,一个用于环回...问题是如何将内部请求与外部请求分开
        【解决方案6】:

        我认为您在Location 块底部的Satisfy Any 之后,如果AllowRequire 指令中的任何 匹配(而不是默认,这要求它们 all 匹配)。

        文档是here

        【讨论】:

        • 这似乎对我不起作用。它让我可以匿名结账,也可以匿名签到!
        猜你喜欢
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 2017-09-15
        • 2015-10-09
        • 2010-11-19
        • 2016-07-16
        相关资源
        最近更新 更多