【问题标题】:set up gerrit with http authentication使用 http 身份验证设置 gerrit
【发布时间】:2013-08-13 08:03:41
【问题描述】:

我正在尝试使用 http baisc 身份验证配置 gerrit,我的 httpd 配置是

<VirtualHost *:8081>
    ServerName localhost

    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On

    <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>

<Location "/login/">
AuthType Basic
AuthName "Gerrit Code Review"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user
</Location>
ProxyPass / http://localhost:8081/
</VirtualHost>

我的 gerrit.config 是

[gerrit]
        basePath = git
        canonicalWebUrl = http://localhost:8081/
[database]
        type = mysql
        hostname = localhost
        database = reviewdb
        username = gerrit
[auth]
        type = HTTP
[sendemail]
        smtpServer = localhost
        smtpUser = gerrit
[container]
        user = gerrit
        javaHome = /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = proxy-http://*:8081/
[cache]
        directory = cache

我不确定我哪里出错了,但访问 http://x.x.x.x:8081

The HTTP server did not provide the username in the Authorization header when it forwarded the request to Gerrit Code Review.

If the HTTP server is Apache HTTPd, check the proxy configuration includes an authorization directive with the proper location, ensuring it ends with '/': 

我的 gerrit 在内置码头计数器上运行,我的操作系统是 centos 6.4

我哪里错了?

【问题讨论】:

    标签: apache http gerrit


    【解决方案1】:

    好的。实际上,我在端口8081 上创建了一个虚拟主机,而我的 Jetty(与 gerrit 一起提供)也在监听同一个端口,我的配置几乎保持不变,但这些是额外的步骤:-

    • 为您的 selinux 添加一个新端口(最初定义了一些基本端口),或者如果安全不是问题,您可以禁用它。
    • 告诉httpd监听这个端口(在我的例子中我添加了8082),所以在你的http conf文件中添加listen &lt;port-no&gt;这一行
    • 将虚拟主机更改为您的端口号 现在你的虚拟主机设置在 8082 端口上

      <VirtualHost *:8082>
          ServerName localhost
      
          ProxyRequests Off
          ProxyVia Off
          ProxyPreserveHost On
      
          <Proxy *>
                Order deny,allow
                Allow from all
          </Proxy>
          <Location "/login/">
                AuthType Basic
                AuthName "Gerrit Code Review"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
          </Location>
      
          ProxyPass / http://localhost:8081/
      </VirtualHost>
      
    • 将规范 url 更改为端口 8082(以便将其重定向到同一端口)

    • 最后重启 apache 和 Gerrit(访问 your-host:8082)。

    【讨论】:

    • 感谢您的配置在结帐时对我有用。但是,我不会推动出现Authentication failed for... 之类的错误
    • 如果您从 OpenId 切换到 HTTP,如果来自 HTTP 的用户名与已用于 OpenID 的用户名匹配,Gerrit 将不会自动创建account_external_ids。验证后将显示简短的“禁止”消息。要解决此问题,请将与您的用户匹配的行插入到 account_external_ids 表中,其中 external_id 等于 gerrit:username
    【解决方案2】:

    您的配置存在一些问题:

    1. Apache 并尝试在同一个端口 8081 上侦听,这是不可能的
    2. 您的 ProxyPass 不是最好的,它会产生一些小问题。这些问题是:
      1. 无法创建带有斜杠的项目名称,例如:main/sub
      2. 审核文件时,复选标记不会出现在文件旁边以显示已审核,这与未正确处理正斜杠有关
    3. 最常见的是使用子文件夹而不是根目录,我想这更适合使用反向代理

    这是我为您推荐的配置:

        <VirtualHost *:80>
            ServerName localhost
    
            ProxyRequests Off
            ProxyVia Off
            ProxyPreserveHost On
    
            <Proxy *>
                  Order deny,allow
                  Allow from all
            </Proxy>
    
            <Location "/">
                AuthType Basic
                AuthName "Gerrit Code Review"
                AuthBasicProvider file
                AuthUserFile /usr/local/apache/passwd/passwords
                Require valid-user
            </Location>
    
            AllowEncodedSlashes On
            ProxyPass /r http://localhost:8081/r nocanon
        </VirtualHost>
    

    当然别忘了修改gerrit.config,canonicalWebUrl是你在地址栏中输入的,不是apache用来查找gerrit的。

    [gerrit]
        basePath = git
        canonicalWebUrl = http://localhost:8082/r
    

    为了防止 apache 默认页面显示在你的根文件夹中添加一个 index.php,它将你的浏览器重定向到子路径:

    <?php
        header('Location: http://localhost:8082/r/');
    ?>
    

    【讨论】:

    • 我已经按照上面的方法进行了配置,但是我只需要在端口 8082 上设置它,因为我在端口 80 上托管了一些其他服务,无论如何,当我在 localhost:8082 上运行时,它会显示apache的测试页面,我哪里出错了?
    • 您是否使用了子文件夹? localhost:8082/rlocalhost:8082/r 是有区别的,第二个会转发,第一个不会。在我的情况下,我实际上在根目录(/var/www/index.php)中添加了一个 index.php 文件,该文件重定向到子路径,我在上面添加了它。
    • 我们为什么要使用“/r/” 我的意思是,在我的原始配置中,我使用了 /login/ 因为 gerrit 需要在 mygerrit:8081/login 上的授权标头无论如何将其更改为 /r/ 并没有解决问题。
    • 在这种情况下不应该设置反向代理,实际上我是 apache 配置的新手,所以我对此一无所知,我想添加带有斜杠的项目,但不知道如何获取与此同时。现在它在带有斜杠的项目名称上给出 404 错误
    • 不需要反向代理设置,因为您指定了 canonicalWebUrl,Gerrit 将使用它。好的,我没有将 canonicalWebUrl 更新为 8082 端口。并且对于位置,你不需要指定/r/,你可以使用/。这仅用于身份验证。当您使用 HTTP 身份验证时,/login/ 已过时,因为它们不再是匿名访问,对吧?
    【解决方案3】:

    Gerrit 它期望提供身份验证。当您使用 HTTP 身份验证时,它不允许匿名访问。

    为此,您需要在根目录进行身份验证,并且您的 Location 块应如下所示:

    <Location "/">
      AuthType Basic
      AuthName "Gerrit Code Review"
      AuthBasicProvider file
      AuthUserFile /usr/local/apache/passwd/passwords
      Require valid-user
    </Location>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多