Nginx http_auth_request_module 统一用户验证权限验证

 

auth_request与access|auth_basic比较


无论是通过access模块限制IP还是通过auth_basic模块设置用户名密码,这些都是非常简单的用户验证方式。

在生产环境当中很可能会有动态web服务器,它们通过更加复杂的用户名密码权限验证。这个时候可以通过访问nginx资源时候,先将用户的去请求传递给这样的应用服务器,根据应用服务器返回的结果再判断请求资源能不能继续执行。在access阶段有一个auth_request模块,该模块就可以完成这样的功能。

可以通过合理配置Nginxauth_request模块来实现对敏感路径下的内容进行访问限制(通过auth_request来进行的权限限制)。该模块默认是不会编译到Nginx中的需要手动添加--with-http_auth_request_module   

 

auth_request原理语法


原理:收到请求后,先将该请求hold住,生成子请求,子请求和该请求内容是相同的。通过反向代理技术把子请求传递给上游服务,根据上游服务的响应再来决定是否处理当前的请求。

功能:向上游的服务器转发请求,若上游服务器返回的响应码是2XX,则继续执行。若上游服务器返回的是401或者403,则将响应返回给客户端。

Syntax: auth_request uri | off;  --加上url会生成一个子请求,这个子请求会访问该url,根据该url返回的结果来决定是否允许该请求向下继续执行
Default: auth_request off;
Context: http, server, location

Syntax: auth_request_set $variable value;  --根据返回的结果设置变量来做进一步处理
Default: —
Context: http, server, location

 

举个例子如下


服务器A(192.168.179.99),其路径/上存有敏感信息,其他路径可公开访问。
服务器B(192.168.179.100),为认证服务器,其上部署了本项目代码。

服务器A(server1)的Nginx配置文件:

location / {
     auth_request /test_auth;  --生成子请求会去访问location = /test_auth{}
 } 

location = /test_auth{
     proxy_pass http://192.168.179.100/auth_upstream;  --反向代理到后端auth_upstream
     proxy_pass_request_body off;
     proxy_set_header X-Original-URI $request_uri;
}

[root@localhost ~]# echo "proxy back this is 192.168.179.99" > /usr/local/nginx/html/index.html   --该条记录用来验证用户在后端192.168.179.100返回状态

(1)服务器B(server2)的Nginx配置文件:

server{
      listen  80;
      access_log  logs/host.log  main;
      charset utf-8;
      location /auth_upstream{
      return 200 'auth success';
     }

[root@localhost ~]#  curl -I 192.168.179.99
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 29 Jul 2020 02:12:48 GMT
Content-Type: text/html
Content-Length: 42
Last-Modified: Sat, 04 Jul 2020 01:28:06 GMT
Connection: close
ETag: "5effdb26-2a"
Accept-Ranges: bytes

如果用户为合法用户:
那么服务器B将会生成session,并通过Set-cookie命令告知用户浏览器。用户通过此Cookie即可获得服务器B的认可授权。当用户通过此Cookie访问服务器B中的/auth_upstream目录时,会返回200的状态码。 

 

(2)服务器B(server2)的Nginx配置文件:

server{
      listen  80;
      access_log  logs/host.log  main;
      charset utf-8;
      location /auth_upstream{
      return 403 'auth failed';
     }
}


[root@localhost ~]#  curl -I 192.168.179.99
HTTP/1.1 403 Forbidden
Server: nginx/1.16.1
Date: Wed, 29 Jul 2020 02:14:12 GMT
Content-Type: text/html
Content-Length: 153
Connection: close

如果用户为非法用户:
那么服务器B将不会session,由于用户无法获得认可的Cookie,那么当用户再次访问/auth_upstream的路径时,服务器会返回403错误。

 

总结


以上,通过auth_request模块以及相关配置就实现了对敏感内容的访问限制。而且通过第三方的机制,也无需自己手工实现登录功能。同时,此方案可以对同一域名下的不同子域名中的内容进行访问限制。可以重复利用一个登录系统,服务于多个其他系统。(auth_request模块对于我们拥有一个统一的用户健全系统是非常有用的)

要在Nginx中添加http_auth_request_module模块,你可以按照以下步骤操作: 1. 确认你的Nginx版本是否支持http_auth_request_module模块。你可以使用以下命令来检查: ``` nginx -V ``` 在输出结果中查找是否包含 "--with-http_auth_request_module" 字样,如果有,说明该模块已经被支持。 2. 如果你的Nginx版本不支持该模块,你需要重新编译Nginx并启用该模块。首先,下载Nginx的源代码: ``` wget http://nginx.org/download/nginx-x.x.x.tar.gz ``` (将 "x.x.x" 替换为你想要下载的版本号) 3. 解压源代码包: ``` tar -zxvf nginx-x.x.x.tar.gz ``` 4. 进入解压后的目录: ``` cd nginx-x.x.x ``` 5. 执行以下命令进行配置,确保启用了http_auth_request_module模块: ``` ./configure --with-http_auth_request_module ``` 6. 执行以下命令编译并安装Nginx: ``` make sudo make install ``` 7. 配置Nginx的配置文件(通常是位于 /etc/nginx/nginx.conf)。在合适的位置添加以下配置项: ``` location / { auth_request /auth; ... } location = /auth { internal; proxy_pass http://auth_backend; ... } ``` 这里的 "/auth" 是用来处理认证请求的URL,你可以根据需要进行修改。"http://auth_backend" 是实际处理认证请求的后端服务地址,也需要根据实际情况进行修改。 8. 保存并关闭配置文件后,重启Nginx服务: ``` sudo service nginx restart ``` 现在,你已经成功地添加了http_auth_request_module模块到Nginx中。你可以根据实际需求进一步配置和使用该模块来进行认证授权操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值