首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cgit中的访问控制

Cgit中的访问控制
EN

Stack Overflow用户
提问于 2013-07-22 07:49:48
回答 1查看 3.3K关注 0票数 6

一旦cgit的cgi启动,我想向cgit介绍访问控制。这样做的目的是列出所有在gitolite中可用的repos,但基于用户身份验证启用/禁用目录列表。

在apache执行cgit cgi之前,我设法获得了访问控制:

代码语言:javascript
复制
 AllowOverride None
 AuthType Basic
 AuthName "Restricted Files"
 AuthUserFile /var/lib/git_alfonso/passwords

  Options +ExecCGI
   Order allow,deny
   Allow from all

代码语言:javascript
复制
Alias /cgit.png /var/www/htdocs/cgit/cgit.png
Alias /cgit.css /var/www/htdocs/cgit/cgit.css
ScriptAlias /cgit "/var/www/htdocs/cgit/cgit.cgi"
RewriteRule ^$ / [R]
RewriteRule ^/(.*)$ /cgit.cgi/$1****

但是,我不知道如何在访问存储库路径后获得同样的效果,我尝试使用目录指令并在那里添加身份验证,但是一旦启动,apache就不应用http.conf文件中所述的任何其他指令。

关于如何实现这个目标有什么线索吗?

提前谢谢。

布尔阿方索。

EN

回答 1

Stack Overflow用户

发布于 2013-07-22 08:40:11

我正是在我自己的cgit配置中做到了这一点。

代码语言:javascript
复制
# CGit on @PORT_HTTP_CGIT@
Listen @PORT_HTTP_CGIT@
<VirtualHost @FQN@:@PORT_HTTP_CGIT@>
ServerName @FQN@
ServerAlias @HOSTNAME@
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
DocumentRoot @H@/cgit
Alias /cgit @H@/cgit
<Directory @H@/cgit>
  SetEnv GIT_PROJECT_ROOT=@H@/repositories
  AddHandler cgi-script .cgi .pl
  DirectoryIndex cgit.pl

(值的@xx@ are模板占位符)

其想法是使用自定义脚本cgit.cgi (这里是perl脚本,但您可以使用任何其他脚本语言)包装 cgit.pl,这将:

  • 海泡石
  • 只显示由海泡石授权的东西

您可以看到完整的剧本在这里

这是当您试图访问特定的回购时:

代码语言:javascript
复制
if ($request_uri ne "/cgit/" && $request_uri ne "/cgit/cgit.pl/") {
  (my $repo)=($path_info =~ /\/([^\/]+)/);
  my $perm = "R";
  if ($repo ne "") {
  my $aperm = access( $repo, $user, 'R', 'any' );
  # my ($aperm, $creator) = &repo_rights($repo);
    $perm=$aperm;
  }
  if ($perm !~ /DENIED/) {
    system("@H@/cgit/cgit.cgi");
  }
}

这是在没有回购的情况下调用cgit的时候:它应该只列出您有权看到的repos。

为此,调用本机cgit.cgi,然后过滤输出,删除与“拒绝”回复对应的任何行:

代码语言:javascript
复制
    my $fname="$user.".timestamp().".tpl";
    system("@H@/cgit/cgit.cgi > $fname");
    open(INFO, $fname); # Open the file
    @lines = <INFO>; # Read it into an array
    close(INFO);
    unlink($fname);
    pop(@lines);
    foreach (@lines) {
      my $line=$_;
      (my $repo)=($line =~ /title='([^']+)'/); #'
      my $perm = "R";
      if ($repo ne "") {
      my $aperm = access( $repo, $user, 'R', 'any' );
        # my ($aperm, $creator) = &repo_rights($repo);
        $perm=$aperm;
      }
      if ($perm !~ /DENIED/) {
        print $line;
      }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17782419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档