我在nginx中使用基本身份验证,没有问题,但我想限制用户通过身份验证的不同位置的数量, 最终目标是防止用户共享访问数据到网站,因为网站实时"监控"对于某些数据,我不知道如果从另一个ip使用相同的用户/通道组合,那么这两个用户都会停止获取数据, 或者其中一个停止获取数据。
答案 0 :(得分:0)
我认为这不是一个好主意,因为用户可以同时通过电脑和手机登录,并且有两种不同的IP地址。 http-auth也不是为了满足您的需求而设计的。当用户离开而没有注销时,它必须记住ip-address并使其以某种方式过期。总而言之,难以猜测会话有效期多长。另一个问题是,大多数用户没有静态IP,并且每24小时都会被提供商断开连接。如果在有效登录后发生,会发生什么?
处理此类问题的最常用方法是会话cookie。这些可以描述为一次性密码,您可以根据需要或直到它使用它。 SessionID通常保存在某种类型的数据库中,并使这些会话唯一不会是一个大问题,因此可能是你想要的。幸运的是 ngx_http_auth_request_module允许您只实现这个缺失的部分,并且可以在不开发自己的nginx模块的情况下尽可能接近您(请参阅https://www.nginx.com/resources/wiki/modules/获取可用模块)。
另一方面:不要这样做。认真。如果你关心安全,不要试图重新发明轮子并使用已经证实的东西。例如。 ngx_http_auth_jwt_module允许您使用OpenID,这也使您无需在服务器上保存合理的用户数据(因为除非绝对必要,否则没有人想保存密码)。
这两种方法都需要nginx模块,这些模块可能未安装在您的服务器上。如果您没有构建它们的权限,我建议将其添加到您的问题中,以便其他人可以为非root服务器建议解决方案。
如果您想让它更简单,您还应该考虑每次都生成下载链接,并在数据库中保存IP地址和下载链接地址。当用户下载该文件并完成后删除条目。为了工作你可以使用
Content-Disposition: attachment; filename=FILENAME
- HTTP-Header,以便您的download.php
不会保存同样调用的文件。
也许你也可以找到某种javascript替换ngx_http_auth_jwt_module
并使用OpenID和http-auth。这可以工作,因为也可以使用ajax进行身份验证。
最后但并非最不重要:如果您仍想使用http-auth,也请使用HTTPS,因为默认情况下,此身份验证方法不会对您的密码进行加密。
答案 1 :(得分:0)
你想做的事情是不寻常的,所以你需要编写很多逻辑来处理这个过程。
您的代码需要为每个用户存储一个用户ID和IP地址对,并根据此验证每次尝试登录。如前面的答案所指出的,您将需要使登录等过期。基本上,您需要滚动会话处理程序。
这不是不可能或特别困难,但您需要自己使用Nginx可用的脚本语言编写,这些语言是Perl,由于Nginx中的生态系统有限而不推荐使用,或Lua,强烈建议使用大规模的Nginx lua生态系统(例如Cloudflare使用)。
您需要在3rd party Nginx Lua Module和相关模块中进行编译,或者只需卸载Nginx并使用已经包含所有内容的Openresty Bundle代替......如果需要,可以使用Redis进行存储扩大规模。
以下是一些可以用作构建块的工具
Openresty Redis Session Library
Openresty Encrypted Session Module
请注意,如果您愿意,可以直接在Nginx中实现Openresty内容而无需运行Openresty,因为它只是一个方便的Nginx和有用的模块包。