[我想你在这里问了四个问题。其中一些重叠。我将尝试尽可能多地回答,然后编辑您的问题以使其更清晰。发布您当前的 Apache 可能会有所帮助,httpd.conf
以便人们可以看到您当前如何处理访问和身份验证。这样,您可能会获得有关如何将代理应用程序与您的 Apache 实例集成的更好建议。]
设置可以处理“网站单点登录”的前端需要一些规划和配置,但值得付出努力。为了使这更容易,您需要使用 Apache-2.4。您可能正在使用此版本,但 Apache 已成为某种主力,因此某些网站的更新频率比过去少得多。Apache 2.4 包括mod_session
并且mod_auth_form
可以使用 Apache 为具有多个后端应用程序服务器(通常在单独的机器端口或套接字上运行)的站点设置基于表单的“门户网站单点登录”工具,这些工具组合在一个面向外的地方一组 URL/URI。这种使用模式在 Apache 中非常普遍,以至于 2.4 版本添加了一些功能以使其更易于使用。
您询问了一种“简单推荐”的方法来执行您所描述的操作。好吧,你在正确的轨道上。Apachehttpd
对于这种身份验证/授权和“用户登录”类型的应用程序非常有用 - 以至于它已成为您尝试做的主要工具。
您询问如何将用户信息“传递”到后端服务器。您可以像在任何 Web 应用程序中处理状态一样执行此操作:使用会话和 cookie。会话信息包含编码为application/x-www-form-urlencoded
字符串的键/值对。您还可以创建HTTP_SESSION
后端应用程序可以读取的环境值。如果你想在那里使用它们,你的 Plack/Starman 应用程序必须能够处理会话和 cookie(即它必须是“会话感知的”)。查看Plack::Middleware::Session
有关如何解决此问题的想法。
当然,设置身份验证mod_auth_form
比Basic
身份验证更复杂。但是对于基于表单的登录,可以(明智地)使用 javascript,客户端应用程序可以在本地存储表单信息以便快速登录;同样,表单很灵活,可以收集更多数据并将更多信息传递给用户,Apache 可以处理一些复杂性(身份验证后的重定向)。由于它们只是一个 HTML <form>
,因此您可以简单地开始并随着您的站点的增长使它们更加精细。也就是说,您可以简单地Basic Auth
为您的后端提供一个 Apache 反向代理。
在没有看到有关您的安装的更多详细信息的情况下,我无法说出您mod_rewrite
本身可能需要的方式/原因,但是Rewrite
指令可以很好地与ProxyPass
. 当然,在您的整个站点中,您需要检查身份验证和会话信息,并在必要时/在必要时将用户重定向到登录表单。使用mod_auth_form
使这更容易实现,但代价是配置更复杂。至于反向 prosy 本身,您ProxyPass
将以正常方式使用将请求传递到后端:
ProxyPass /app http://[starmanhost]:3000/
然后,您需要配置或调整您当前的 Apache 系统,以便以标准 Apache 方式Session On
对相关 URL 进行身份验证(除非整个/
需要身份验证):
<Location /app>
AuthType Basic
Session On
SessionCookieName session path=/
...
require valid-user
</Location>
等等。正如 Apache 文档所指出的(你会想阅读mod_session
等等mod_proxy
),你可以传递会话信息以供后端应用程序使用。
如果该SessionHeader
指令用于定义 HTTP 请求标头,则编码为 application/x-www-form-urlencoded 字符串的会话将对应用程序可用。
mod_session_crypto
为了隐私/安全,如果可能的话,你会想要使用SSL。正如您所注意到的,您不需要“端到端”加密(即从客户端到向外的前端以及反向代理和后端应用程序之间的 HTTPS),但是如果外部连接是https://
并且您将会话信息保留在服务器上(使用mod_session_dbd
作为另一个响应指出)使用加密存储,您可以避免在服务器之间共享用户会话信息所固有的明显威胁。最好的部分是您可以一层一层地添加这些层,而无需大量修改后端应用程序。这是创建可靠的“WebSSO 服务器”前端来处理登录的优势。
请注意,我在这里使用术语 WebSSO 有点松散。严格来说,WebSSO(和 SSO)是更广泛、更包容的概念,具有自己的标准轨道和技术(有几个 Apache 项目专注于此)。这就是为什么我倾向于将您尝试的方法称为“网站 SSO”。对各种身份验证、编程语言模块、代理和重写的支持使 Apachehttpd
成为以这种方式处理登录和会话的首选“瑞士军刀/胶带”。
您这样做的理由是合理的,因为您可以避免额外的登录和混淆用户(及其浏览器)。此外,通过将身份验证步骤与您的应用程序分离并将该任务专用于 Apache,您可以让开发人员更轻松地编写后端应用程序。你的问题很笼统。我认为您可以开始尝试这里开始出现的一些建议,如果您遇到问题,您可以跟进针对您的实施的更具体的问题。
首先让 Apache 位正常工作 ( Session On
; ProxyPass
, <Location /app>
) 并确保前端创建、存储和传递正确的信息。这对于未来的许多事情都非常有用。Apache 大师可以在这里提供帮助。将正确的会话信息传递到后端后,您可以询问有关如何在 perl 代码中使用starman
和访问和使用它的问题plack
。工具和文档中可能存在缺失或粗糙的部分,但许多网站都希望按照您的描述进行操作,因此这些内容会出现并继续改进。祝你好运。
参考