我想出了以下脚本/解决方案:
<?php
$validApplications = array("Application_1", "Application_2");
$baseUrl = 'http://' . $_SERVER["SERVER_NAME"] . '/';
if(!isset($_SERVER["REMOTE_USER"])){
header('HTTP/1.1 401 Not Authorized', true, 401);
//...display error page
exit(0);
}
if(!isset($_GET["applicationName"])
|| !in_array($_GET["applicationName"], $validApplications) ){
header('HTTP/1.1 400 Bad Request', true, 400);
//...display error page
exit(0);
}
$application = $_GET["applicationName"];
if(!isset($_GET["returnTo"])){
$returnTo = $baseUrl . $application . "index.php";
} else {
$returnTo = $_GET["returnTo"];
}
$sessionName = "PHP" . $application . "Session";
session_name($sessionName);
session_start();
session_regenerate_id(TRUE);
/* erase data carried over from previous session */
$_SESSION=array();
$_SESSION['login'] = $_SERVER['REMOTE_USER'];
header("Location: " . $returnTo);
?>
这个脚本,我们称之为 login.php 必须在一个相应的 Apache2 模块下,该模块可以设置 $_SERVER["REMOTE_USER"] (我使用 PyAuthenNTLM2),就像我的问题中显示的那样。
然后,应用程序中的每个网页必须首先检查是否设置了 $_SESSION['login'] ,如果没有则重定向到此登录页面:
if (!isset($_SESSION['login'])) {
$queryString = "returnTo=" . urlencode($_SERVER["REQUEST_URI"]) . "&applicationName=Application_1";
header ("location: " . $baseUrl . "login.php?" . $queryString);
exit(0);
}