背景
我正在为网站寻找一个透明的、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将是一个很大的更改。
编辑显然,这被称为"前控制器"模式。