在 Nginx 中将身份验证限制为特定用户名

在 Nginx 中将身份验证限制为特定用户名

是否可以将 Nginx 中的身份验证限制为特定用户名?例如,我有多个子域,并且想将该子域限制为仅 1 个用户。所有用户都在 1 个 .htpassword 文件中。在 Apache 中,您可以按如下方式执行此操作:

AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
Require user rbowen

但是我还没有在 Nginx 中找到类似的方法。

这就是我当前的 Nginx 设置。我在每个服务器 {} 块中为每个用户设置了一个。

auth_basic "Restricted";
auth_basic_user_file /usr/local/apache/passwd/passwords;

答案1

如果我理解得好,您有一个包含多个用户名和密码的文件,并且您想将每个服务器块的身份验证限制为该文件中的特定用户,并保持配置集中?

不幸的是,您无法使用 nginx 来做到这一点,您需要将文件拆分为多个仅包含一个用户:密码对的文件。

答案2

事实上,通过一些技巧,这是可能的:

    auth_basic "Restricted";
    auth_basic_user_file /usr/local/apache/passwd/passwords;

    set $AUTHFAIL "";
    if ($remote_user != "rbowen") {
      set $AUTHFAIL "1";
    }
    # required, when user is not yet authorized to ... basically authorize 
    if ($remote_user = "") {
      set $AUTHFAIL "";
    }

    if ($AUTHFAIL = "1") {
      return 403;
    }

这里我们将变量设置为空,如果变量为空,我们就可以继续。但如果授权用户与模式不匹配 - 进一步的请求将失败并显示 HTTP 403。

另外,通过改变模式,可以提供用户列表或将构造移动到区块并为每个区块location使用不同的用户。location

更新:

为了让生活更加轻松,auth_user在以下位置创建文件nginx.conf

# to use:
# set $auth_user='';
# include auth_user;


auth_basic "Hey, say some magic words";
auth_basic_user_file .htpasswd;

set $AUTHFAIL "";
if ($remote_user != $auth_user) {
  set $AUTHFAIL "1";
}
# required, when user is not yet authorized to ... basically authorize 
if ($remote_user = "") {
  set $AUTHFAIL "";
}

if ($AUTHFAIL = "1") {
  return 403;
}

然后,无论特定用户需要什么身份验证,请使用:

location / {
  ...
  set $auth_user='bob';
  include auth_user;
  ...
} 

相关内容