通過git-http-backend方法提供的http服務基本上可以做到認證用戶才能使用,但只能控制到服務器路徑訪問,而且無法區分讀寫。經過不懈努力,找到了方法,相關腳本及配置見后。
基本思路就是利用apache的路徑權限設置控制版本庫的讀權限;通過hooks/pre-receive鈎子來控制版本庫的寫權限,具體鈎子的原理和用戶這里不寫了。git提供了幾個全局變量可以在pre-receive鈎子里面使用,詳情可以參看git-http-backend manual page。
通過REMOTE_USER獲取執行push的用戶名,通過PATH_INFO獲取項目名稱。
此方法的弊端就是配置比較復雜,而且需要重啟apache
附上pre-receive:
#!/bin/sh
prj=${PATH_INFO:1}
prj=${prj%/*}"-write:"
priusr=$(cat ../git.group|grep $prj)
priusr=${priusr##*:}
for ele in $priusr
do
if [ $ele == $REMOTE_USER ]
then
#echo 'user found ' $ele
exit 0
fi
done
echo "Access denied"
exit 1
以及apache的git.conf相應內容:
#config for git-http-backend SetEnv GIT_PROJECT_ROOT /git/repositories SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /mygit/ /usr/libexec/git-core/git-http-backend/ #privilege config <Location /mygit/test> AuthType Basic AuthName "Git Access" AuthUserFile /git/repositories/git.passwd AuthGroupFile /git/repositories/git.group <Limit GET PUT POST DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK> Require group test-read</Limit> </Location>
/git/repositories/git.group如下,此處的read組一定要包含write組。
test-read:bill jobs
test-write:jobs
按照以上配置,bill,jobs都可以clone和pull項目,但只有jobs可以push