authentication - Nginx -> Apache 2 认证 -> 返回 Nginix
问题描述
我们有一个 nginx 和一个 apache2 服务器。
Apache2 配置为管理 Kerberos (Active Directory) 身份验证。
我们有一个由 nginx 管理的网站,有一个保留区域。
我会知道这是否可能:
用户访问由 nginx 管理的主站点
从主站点,有一个链接到映射到 apache2 的“/login”:
location /login/ {
proxy_pass http://apache2server/testlogin;
}
- 登录成功后,apache2 被配置为转到另一个 nginx 网页,也使用 proxypass:
ProxyPass /testlogin http://nginxserver/logindone.php
ProxyPassReverse /testlogin http://nginxserver/logindone.php
我想知道这是否是解决问题的正确方法。
解决方案
对NGiNX网站实施外部身份验证的最佳方法是使用auth_request
指令。
基本上,您可以保护对任何外部 Web 服务器执行子请求的任何请求。子请求必须返回 HTTP 代码 2XX 以允许继续处理内容,并且返回的任何其他 HTTP 代码将拒绝访问。
为此,请确保您已启用NGiNX (使用auth_request
编译--with-http_auth_request_module
)。要检查这一点,请在 shell 中使用以下命令:
nginx -V 2>&1 | grep "http_auth_request_module"
将auth_request
指令添加到您要保护的位置,指定授权子请求将被转发到的内部位置,使用:
location /system/ {
auth_request /auth;
#...
}
因此,当向/system/ location 发出请求时,系统将创建对/auth location 的子请求。现在我们需要创建内部/auth位置。我们可以使用下面的示例:
location = /auth {
internal;
proxy_pass http://my.app.webserver/auth_endpoint;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
#...
}
在这里,我们创建了/auth内部位置。我们使用该internal
指令禁用外部NGiNX访问(该位置不会处理对/auth的任何外部请求)。此外,我们删除了请求正文内容并将请求长度设置为零,从而删除了所有原始请求变量。我们向http://my.app.webserver/auth_endpoint发出子请求,传递所有请求的 cookie,因此您的后端应用程序可以确定用户是否有权访问。
如果您需要知道原始请求的 URI,您可以在子请求中将其添加到额外的 HTTP 标头中添加:
proxy_set_header X-Original-URI $request_uri;
您可以在此处了解有关NGiNX auth_request
指令的更多信息。
推荐阅读
- kotlin - 过滤列表然后更改类型
- php - 将 12 个月添加到 2 月 29 日
- c# - CrystalDecisions.Shared.CrystalReportsException:加载报告失败。文件未打开
- python - 如何在 reg 表达式中检查大于检查?
- sql-server - 解码十六进制数据类型
- redis - 用于测试 KeyDB 的数据集
- json - _CastError(类型 '_InternalLinkedHashMap
' 不是类型 'List 的子类型 ' 在类型转换中) - jquery - 如何从输入中获取值
- exception - Kotlin 良好实践中的 Catch Exception 类?
- python - Custom scikit-learn scorer can't access mean after fit