nginx group http auth

时间:2012-06-17 21:01:59

标签: authentication nginx

来自apache2的

是我无法归档的唯一功能:让用户使用密码数据库(htpasswd)并允许访问不同的文件/文件夹/虚拟服务器。

基本的http auth我启用了工作:

location ~ ^/a/ {
    # should allow access for user1, user2
    auth_basic            "Restricted";
    auth_basic_user_file  /etc/nginx/auth/file_a;
}
location ~ ^/b/ {
    # should allow access for user2, user3
    auth_basic            "Restricted";
    auth_basic_user_file  /etc/nginx/auth/file_b;
}

如果file_a中的 user1 user2 user2 中的 user3 ,则{{} 1}},这有效但我必须在更改 user2 的密码时更新这两个文件(所有位置的密码应该相同)。由于我将拥有> 15个具有不同访问权限和> 10个用户的不同位置,因此这不是很容易处理。 (我喜欢精细的访问权限!)

使用Apache我为每个位置定义了不同的组,并且需要正确的组。更改访问权限就像向组添加/删除用户一样简单。

是否有类似的东西,或者如何使用nginx轻松处理这种情况?

3 个答案:

答案 0 :(得分:13)

您可以使用AuthDigest模块和领域作为组来实现此功能 - 您将为一个用户提供多个条目,但您可以在一个文件中逐行排列。不完美,但比你现在的噩梦更好。

配置中的小变化(请参阅第二个位置的auth_digest和user_file):

location ~ ^/a/ {
    # should allow access for user1, user2
    auth_digest            "Restricted";
    auth_digest_user_file  /etc/nginx/auth/file_a;
}
location ~ ^/b/ {
    # should allow access for user2, user3
    auth_digest            "Restricted2";
    auth_digest_user_file  /etc/nginx/auth/file_a;
}

和file_a:

user1:Restricted1:password_hash
user2:Restricted1:password_hash
user2:Restricted2:password_hash
user3:Restricted2:password_hash

答案 1 :(得分:0)

我最终使用基本的http auth:

来管理它
  • 对于每个组,我都有一个单独的密码文件,例如group_a.authgroup_b.auth,...
  • 此外,我有一个文件,其中每个用户和密码都被写入,例如passwords.txt
  • passwords.txt具有与auth文件相同的格式,因此类似于user1:password_hash
  • 我有一个ruby脚本update.rb,用于将用户的密码从password.txt同步到所有.auth个文件(更多是sed的包装器):

Ruby脚本update.rb

#!/usr/bin/env ruby

passwords = File.new("./passwords.txt","r")

while pwline = passwords.gets
    pwline.strip!
    next if pwline.empty?

    user, _ = pwline.split(':')
    %x(sed -i 's/#{user}:.*/#{pwline.gsub('/','\/')}/g' *.auth)
end
  • 更新用户密码:更新passwords.txt中的密码并执行update.rb
  • 要将用户添加到群组(例如new_usergroup_a),请执行以下操作:打开group_a.auth并添加第new_user:行。如果用户不在,则将new_user:password_hash添加到passwords.txt并最终运行update.rb

答案 2 :(得分:-1)

我使用的是脚本nginx-groups.pl,用于解析apache样式的密码和分组文件,并为每个组生成单独的密码文件。因此它基本上与Markus中的Ruby脚本做同样的事情。回答,但它只为所有组使用一个文件,组文件的格式与apache相同。

该脚本的当前版本是:

#! /usr/bin/env perl

use strict;

die "Usage: $0 USERSFILE GROUPSFILE\n" unless @ARGV == 2;
my ($users_file, $groups_file) = @ARGV;

my %users;
open my $fh, "<$users_file" or die "cannot open '$users_file': $!\n";
while (my $line = <$fh>) {
    chomp $line;
    my ($name, $password) = split /:/, $line, 2;
    next if !defined $password;
    $users{$name} = $line;
}

open my $fh, "<$groups_file" or die "cannot open '$groups_file': $!\n";
while (my $line = <$fh>) {
    my ($name, $members) = split /:/, $line, 2 or next;
    next if !defined $members;
    $name =~ s/[ \t]//g;
    next if $name eq '';
    my @members = grep { length $_ && exists $users{$_} } 
                  split /[ \t\r\n]+/, $members;

    my $groups_users_file = $name . '.users';

    print "Writing users file '$groups_users_file'.\n";

    open my $wh, ">$groups_users_file" 
        or die "Cannot open '$groups_users_file' for writing: $!\n";

    foreach my $user (@members) {
        print $wh "$users{$user}\n"
            or die "Cannot write to '$groups_users_file': $!\n";
    }

    close $wh or die "Cannot close '$groups_users_file': $!\n";
}

将其保存在您喜欢的任何名称下并使其可执行。不带参数调用它将打印一个简短的使用信息。

有关详情,请参阅http://www.guido-flohr.net/group-authentication-for-nginx/