我可以用Apache';实现一个透明的、基于PHP的身份验证层吗;有人帮忙吗


Can I implement a transparent, PHP-based authentication layer with Apache's help?

背景

我正在为网站寻找一个透明的、PHP驱动的身份验证层。

我知道以下简单的方法:

HTTP身份验证

力学:

  • Apache控制访问权限
  • 尝试透明地访问给定目录中的任何文件需要HTTP身份验证(如果尚未进行身份验证(

不利因素:

  • 有限的配置选项
  • 难以与现有用户数据库集成
  • 无法控制登录提示的视觉呈现

基于PHP的登录

力学:

  • PHP控制访问权限
  • 尝试访问为系统显式构建的任何文件(如果尚未进行身份验证(将导致重定向到登录页

不利因素:

  • 如果我忘记在任何PHP文件的顶部编写所需的include "login_required.inc.php";或类似内容,那么任何人都可以访问该文件

我想要什么

我想实现基于PHP的登录解决方案,但要以某种方式配置Apache,以便在请求任何PHP文件时透明地调用login_required.inc.php(或类似的(作为中间步骤。

此脚本将:

  • 跑步
  • 检查会话变量
  • 告诉Apache"是,生成请求的页面"或"否,重定向到登录页面">
  • 不需要在每个需要身份验证的PHP脚本的顶部插入代码

这是白日梦吗?或者我可以做吗?如果是,怎么做?

如果通过index.php重写所有php请求,则index.php/php将控制对任何内容的访问。

RewriteRule ^(.*)$ /index.php?pageid=$1 [QSA,L]

类似的东西会将任何请求推送到index.php,在那里你可以进行身份验证,然后它会将内容农场化。。。

其中的QSA将保留任何查询字符串参数等。

我认为您应该重组您的网站以使用Front Controller。几乎每个框架都使用FrontController模式是有原因的:单点访问使您的应用程序更简单。

一种可能性是使用.htaccess ModRewrite将所有请求重定向到login_required.php?redirect=<ORIGINALLY-REQUESTED-SCRIPT>

login_required.php可以施展魔法并执行以下操作之一:

  • 出示登录表单
  • include <ORIGINALLY-REQUESTED-SCRIPT>
    • 请注意,我相信header("Location: <ORIGINALLY-REQUESTED-SCRIPT>)";只会再次与.htaccess发生冲突,并导致无限重定向循环!基于HTTP_REFERER的值将.htaccess ModRewrite指令设置为仅有条件重定向是不够安全的

这不是首选解决方案,但有可能。。。

另一种可能性:

只有一个入口点。只有一个可以从外部访问的文件,如index.php?target=<REQUESTED-SCRIPT>。这个文件可以包含身份验证逻辑和include所需的脚本。

.htaccess或简单文件权限将阻止所有其他文件的外部访问。

这是一个很好的解决方案,但在整个现有系统中更新所有URL将是一个很大的更改

编辑显然,这被称为"前控制器"模式。