6

这是我的场景:

Apache-reverse-proxy-starman

所以,

  1. 通过加密 HTTPS 的请求转到 Apache,例如:https://server1/MyPerlApp
  2. 如果用户未登录,他们会重定向到某个登录页面(在 server1 中),并且 Apache 不会将请求代理到 Server2
  3. 当用户登录时 - 已通过身份验证 - 然后 Apache 将所有请求转发https://server1/MyPerlApphttp://server2:5000

问题1:这可能吗?(问,因为我对 Apache 的了解不够深入,这也不是一个简单的:

ProxyPass /MyPerlApp http://server2:5000/

因为我需要在 server1 上对用户进行身份验证,并设置ProxyPass只有经过身份验证。由于 Apache 非常灵活,我认为上述答案是肯定的(但非常欢迎确认和详细说明) - 所以这是我的主要具体问题:

  • 我的 Plack 应用程序如何知道在 Apache 级别(在第一台服务器上)验证了哪些用户?
  • 将一些用户信息传递到perlserver2 上的应用程序的简单方法是什么?例如,使用 Apache将参数mod_rewrite附加user=username到每个查询,
  • Apache 可以设置我的perl应用程序应该读取的一些 HTTP 标头吗?
  • 有没有简单和推荐的方法?

我正在寻找如何在我的 starman/perl 应用程序中避免身份验证例程,主要是因为:

  • 用户无论如何都需要登录到 server1(对于他的工作流程中的其他任务)
  • 如果他已经登录,则不需要在我的应用中进行身份验证(避免不必要的双重登录)
  • 但我仍然需要知道哪些用户已登录(通过 server1 上的 Apache)

已经有类似的问题,但是:

4

2 回答 2

11

[我想你在这里问了四个问题。其中一些重叠。我将尝试尽可能多地回答,然后编辑您的问题以使其更清晰。发布您当前的 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_formBasic身份验证更复杂。但是对于基于表单的登录,可以(明智地)使用 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。工具和文档中可能存在缺失或粗糙的部分,但许多网站都希望按照您的描述进行操作,因此这些内容会出现并继续改进。祝你好运。

参考

于 2013-07-24T20:17:57.467 回答
2

Apache 的 mod_session 看起来是您缺少的组件。由于代理是后端应用程序的网关,它可以处理 HTTP 层上的身份验证,并根据需要使用代理条目将会话传回 Perl 脚本。
将用户信息暴露给 Perl 应用程序可以通过几种方式发生。

mod_session_dbd - 是一个在数据库中存储会话信息的模块。然后可以与托管 Perl 应用程序的后端服务器共享它。

mod_session_cookie - 是一个将会话信息存储在客户端浏览器上的 cookie 中的模块。会话变量将存储在 cookie 中,Perl 应用程序将检索它们。

但是,cookie 或将会话变量放在 URL 中会引发安全问题。可以修改 Cookie 和标头。

mod_proxy 应该以 html 的形式将会话变量传递回应用程序。

http://httpd.apache.org/docs/trunk/mod/mod_session.html

于 2013-07-20T03:25:14.047 回答