【问题标题】:How to authenticate user via git pre-receive hook如何通过 git pre-receive 挂钩对用户进行身份验证
【发布时间】:2016-10-27 04:19:13
【问题描述】:

我希望用 Python 编写一个 pre-receive gitook。我的理解是,没有参数被传递到pre-receive 脚本中,而是使用标准输入在单独的行中传递每个引用。我已经能够通过以下方式阅读参考更改:

!/usr/bin/env python

import sys
import fileinput

for line in fileinput.input():
    print "pre-receive: Trying to push ref: %s" % line

但是,对于这个钩子,我主要关心的是确保推送代码的用户具有正确的权限来推送到他们尝试的分支。通过我的研究,我一直无法找到一种方法来寻找提交者的用户凭据。我的目标是将他们的信誉与白名单进行比较,以便授予访问权限。

如何更改我的pre-receive 代码以验证提交用户并验证他们是否被列入白名单以推送到他们尝试的分支?如果有的话,我必须对 git 存储库进行哪些更改才能使代码正常运行?

【问题讨论】:

  • 这对 Python 部分没有帮助,但 Gitolite(主要是 Perl)依赖于 ssh:你强制用户以 git@host.dom.ain 的身份登录并使用 AuthorizedKeys 设置来运行代理命令。请参阅 sshd 文档和 SSH_ORIGINAL_COMMANDgitolite.com/gitolite/how.html(请注意,此处将用户名作为参数传递)。

标签: python git authentication githooks


【解决方案1】:

从标准输入,我们可以得到<old-value> SP <new-value> SP <ref-name> LF。在钩子中使用git cat-file -p $new-valuegit cat-file -p $ref-name,我们可以得到这样的信息

tree d06734b17feff2faf22bcd7c0fac1587876e601d
parent 524bd5e2fa72e6358a22f28582e094de936c3768
author Xyz <mm@nn.com> 1466782764 +0800
committer Abc <ss@tt.com> 1466782764 +0800

或者更直接的方式,我们可以使用git log -1 --pretty=%an $ref-name 获取作者,使用git log -1 --pretty=%cn $ref-name 获取提交者。

所以 bash 中的钩子的一部分可能是这样的:

#!/bin/bash

read old new ref
author=$(git log -1 $ref --pretty=%an)
committer=$(git log -1 $ref --pretty=%cn)
echo author:$author
echo committer:$committer

左边部分是检查作者或提交者是否有权做某事。

我在 python 中实现你的钩子的版本是

#!/usr/bin/env python

import sys
import fileinput
import commands

for line in fileinput.input():
    print "pre-receive: Trying to push ref: %s" % line
    values = line.split()
    old = values[0]
    new = values[1]
    ref = values[2]
    author = ''
    committer = ''
    status,output = commands.getstatusoutput('git log -1 --pretty=%an {0}'.format(ref))
    if status == 0:
        author = output
    status,output = commands.getstatusoutput('git log -1 --pretty=%cn {0}'.format(ref))
    if status == 0:
        committer = output

【讨论】:

    【解决方案2】:

    如果您使用 git over ssh(或本地文件系统中的 git),提交用户将可用于环境变量 USER 中的钩子,因此在 python 中您可以检查 os.environ['USER']

    可以设置一个环境(使用 git-daemon;还有其他方法),让您的 git 服务器接收一个包并且根本没有附加任何身份验证信息;在这种情况下,你就不走运了。

    【讨论】:

    • 跟进:git还提供了哪些其他环境变量?我现在是一个开发团队的新手,我不确定我们是否使用 SSH(我会假设但不确定)。我如何检查以确保是这种情况?如果不是这种情况,我该怎么办?
    • @Configure - 我不认为 git 本身可以保证提供 --any-- 环境变量;它们由传输协议设置(如果已设置)。 ssh 将设置 USER 环境变量;如果您的 git URL(用于设置遥控器)以 ssh: 开头,则您正在使用 ssh:。
    • 您可以使用import os; print os.environ 轻松检查您的环境变量。不过,不能保证他们会一直在那里。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2018-11-08
    • 1970-01-01
    • 2015-11-08
    • 2013-09-24
    相关资源
    最近更新 更多