带有 AuthzUnixGroup 的 git-http-backend 无法正常工作
Posted
技术标签:
【中文标题】带有 AuthzUnixGroup 的 git-http-backend 无法正常工作【英文标题】:git-http-backend with AuthzUnixGroup not working properly 【发布时间】:2014-08-01 23:02:27 【问题描述】:我正在尝试在安装了 git 的 CentOS 6 机器上通过我的 Apache 2.2 建立一个 git 存储库。我尝试了许多不同的方向,但我不知所措。我目前的情况包括可以正常clone
,但完全无法推送。
似乎我无法让身份验证位正常工作,因为我可以在将http.receivepack
设置为true
时正常执行推送。
我已经安装了AuthzUnixGroup
和mod_authz_external
。
我去了/var/www/git
并创建了一个名为my-repo.git
的repo,并在其中做了一个git init --bare
。
然后我在/etc/httpd/conf.d/
中设置我的git.conf
文件如下:
<VirtualHost "*:80">
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAlias /git /usr/libexec/git-core/git-http-backend
AddExternalAuth pwauth /usr/local/libexec/pwauth
SetExternalAuthMethod pwauth pipe
<Directory "/usr/libexec/git-core/">
AllowOverride None
Options +ExecCGI -Includes
Order allow,deny
Allow from all
</Directory>
<Location "/git">
AuthzUnixGroup on
AuthType Basic
AuthName "Git repository"
AuthBasicProvider external
AuthExternal pwauth
Require group git
</Location>
</VirtualHost>
将我的网络浏览器指向mysite/git
很好地向我显示了 HTTP 基本登录对话框,它运行良好。我已将自己添加到组 git
,并在我的 shell 返回上执行 groups
:
naseri sudo git
符合预期。
当我执行git clone http://mysite/git/my-repo.git
时,我从/var/logs/httpd/access_log
下的httpd 的access_log 文件中得到以下信息:
2.177.130.21 - - [11/Jun/2014:18:51:07 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - - [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:08 +0000] "GET /git/my-repo.git/info/refs?service=git-upload-pack HTTP/1.1" 200 256 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:51:09 +0000] "POST /git/my-repo.git/git-upload-pack HTTP/1.1" 200 368 "-" "git/1.8.5.2 (Apple Git-48)"
在客户端,clone
ing 工作正常。我改变了一些东西,然后尝试通过git push
ing 内容在提交后推送。
这是我在服务器端日志中得到的:
2.177.130.21 - - [11/Jun/2014:18:53:26 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:27 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 401 480 "-" "git/1.8.5.2 (Apple Git-48)"
2.177.130.21 - naseri [11/Jun/2014:18:53:30 +0000] "GET /git/my-repo.git/info/refs?service=git-receive-pack HTTP/1.1" 403 - "-" "git/1.8.5.2 (Apple Git-48)"
我可以看到我的“需要身份验证”响应正在由 Apache 在响应的第一行 (401) 发回,但客户端向我显示:
fatal: unable to access 'http://mysite/git/my-repo.git/': The requested URL returned error: 403
我对这个问题一无所知,因为将我的浏览器指向相同的 URL 会正确地启动身份验证,并且它甚至可以正常工作。
【问题讨论】:
【参考方案1】:这个older answer
git-http-backend
在客户端要求使用 git-receive-pack 方法时返回 403/Forbidden 代码。 然后它回退到 WebDAV,但没有必要使用 WebDAV。我遇到了同样的问题;在我的情况下,这是由于
REMOTE_USER
未设置
由于我的任何Apache config 在设置变量时都使用了“=
”,请检查这是否更好:
SetEnv REMOTE_USER $REDIRECT_REMOTE_USER
(两个变量之间没有'-
')
还要检查 not(重新)定义 REMOTE_USER
是否也有效(因为它可能已经定义,而 REDIRECT_REMOTE_USER
可能没有):尝试不使用该行。
我永远不必在我的 Apache Git 配置中定义它。
注意:with Git 2.21 (Q1 2019, 5+ years later), Git should be more robust.
【讨论】:
我尝试了使用和不使用 '=' 并尝试不指定它。没有运气。此外,在检查代码时,它不会要求我提供凭据,我认为这不是正确的工作方式。 @MiladNaseri 你能添加一个Require valid-user
规则,看看它这次是否要求你提供凭据?
问题依然存在。签出时,服务器发送两个 401,然后以 200 响应,产生存储库内容。
我还不能解决这个问题。但是,您的解决方案是唯一尝试正确答案的解决方案,并且正如所承诺的,这是您的奖励,尽管从 2k 到 403k 的用户,它不应该算得那么多:-)
@MiladNaseri 确实很重要 :-) 但我会尝试对您的配置进行更多测试,看看是否可以重现该问题。【参考方案2】:
我遇到过这样的情况,发现尝试使用 Apache 服务 git 绝非易事。
相反,我建议安装Gerrit - 它允许托管多个存储库,最重要的是具有极其灵活的用户/组管理和权限模型。作为一个不错的奖励,它也恰好是非常强大的代码审查引擎,但它是完全可选的 - 如果你不想使用代码审查功能,则不必使用。
其他已知的解决方案是 Gitlab 和 Gitolite - 您可能也想研究它们。
【讨论】:
以上是关于带有 AuthzUnixGroup 的 git-http-backend 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 uuencode 的“sendmail”发送邮件,并带有主题
带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢