nginx group http auth

Mar*_*kus 6 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我有user1,user2 in file_auser2,user3 in file_b,这可行,但是当我更改user2的密码时我必须更新这两个文件(所有位置的密码应该相同).由于我将拥有> 15个具有不同访问权限和> 10个用户的不同位置,因此这并不容易处理.(我喜欢精细的访问权限!)

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

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

c2h*_*5oh 14

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

和file_a:

user1:Restricted1:password_hash
user2:Restricted1:password_hash
user2:Restricted2:password_hash
user3:Restricted2:password_hash
Run Code Online (Sandbox Code Playgroud)


Mar*_*kus 2

我最终用基本的 http 身份验证来管理它:

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

红宝石脚本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
Run Code Online (Sandbox Code Playgroud)
  • 更新用户密码:更新密码并passwords.txt执行update.rb
  • 要将用户添加到组(例如new_user添加到group_a):打开group_a.auth并添加行new_user:。如果用户尚不存在,则添加new_user:password_hash到最后运行passwords.txtupdate.rb