在Nginx反向代理中,可以通过用户认证结合访问控制列表(ACL)来实现更精细的访问控制。以下是详细的配置方法:
首先设置基本的HTTP认证:
server {
listen 80;
server_name example.com;
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
使用htpasswd
工具创建密码文件:
sudo htpasswd -c /etc/nginx/.htpasswd username1
sudo htpasswd /etc/nginx/.htpasswd username2
map $remote_user $is_allowed {
default 0;
"username1" 1;
"username2" 1;
"admin" 2; # 更高权限级别
}
server {
# ... 其他配置
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
if ($is_allowed = 0) {
return 403;
}
proxy_pass http://backend_server;
}
location /admin {
if ($is_allowed != 2) {
return 403;
}
proxy_pass http://backend_admin;
}
}
geo $allowed_user {
default 0;
"username1" 1;
"username2" 1;
"admin" 2;
}
server {
# ... 其他配置
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
if ($allowed_user = 0) {
return 403;
}
proxy_pass http://backend_server;
}
}
geo $valid_ip {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 1;
}
map "$valid_ip:$remote_user" $access_granted {
default 0;
"~^1:.+" 1; # 允许来自信任IP的任何认证用户
"~^0:admin" 1; # 允许admin用户从任何IP访问
}
server {
# ... 其他配置
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
if ($access_granted = 0) {
return 403;
}
proxy_pass http://backend_server;
}
}
map $remote_user $user_group {
default "guest";
"~^admin" "admin";
"~^dev_" "developer";
"~^ops_" "operator";
}
server {
# ... 其他配置
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
if ($user_group = "guest") {
return 403;
}
proxy_pass http://backend_server;
}
location /api {
if ($user_group != "admin" && $user_group != "developer") {
return 403;
}
proxy_pass http://backend_api;
}
}
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
access_by_lua_block {
local user = ngx.var.remote_user
local path = ngx.var.uri
-- 这里可以连接数据库或读取配置文件实现动态ACL
if user == "admin" then
return -- 允许访问
elseif path:match("^/admin") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
proxy_pass http://backend_server;
}
include
指令引入通过以上配置,您可以在Nginx反向代理中实现基于用户认证的精细访问控制。