Il est vrai que BASIC Auth n'a pas de concept de sessions. Cependant, les sessions ne sont pas le seul moyen d'authentifier les utilisateurs ou de garder une trace du nombre d'utilisateurs connectés. En fait, HTTP est sans état, tout comme les sessions HTTP. Vous pouvez seulement deviner combien de personnes sont connectées via le nombre de sessions actives récentes (modifiées récemment).
Vous pouvez implémenter BASIC Auth avec PHP. Vous pouvez deviner combien sont connectés simplement en comptant le nombre d'authentifications effectuées au cours des 5 dernières minutes, ou 10 minutes, etc. Ce serait tout aussi précis que les sessions HTTP.
Par exemple:
Créez un fichier-auth.php de base ou similaire. Ceci est l'exemple de base de PHP.net
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>
Vous pouvez alors require() ce fichier de chaque fichier/répertoire que vous voulez protéger. Cependant, tous les téléchargements devront être validés par PHP maintenant. Supprimez votre authentification de base .htaccess. Puisque vous aurez PHP le faire.
Maintenant, vous le modifier pour authentifier les utilisateurs.
Une chose à noter est que BASIC Auth est seulement une spécification pour l'authentification HTTP. Il ne spécifie pas comment s'authentifier. Puisque vous utilisez Apache, la façon dont vous vous authentifiez est spécifique à Apache. Vous devez avoir créé un fichier de mot de passe pour Apache, similaire à mentionner ici: http://httpd.apache.org/docs/1.3/howto/auth.html#basicconfig
Apache utilise trois fonctions de hachage. Soit crypt, md5 ou sha1. Donc, si vous voulez utiliser le même fichier de mot de passe, vous devez savoir quel hash vous utilisez.
Voici un exemple pour SHA1:
Fondamentalement, vous aurez juste passer par chaque ligne du fichier de mot de passe, et si elle a l'utilisateur, vérifier si les correspondances de mots de passe fournis. Le fichier ressemble à quelque chose comme:
user1: passwordhash1 user2: passwordhash2
Ce qui est juste un utilisateur et son mot de passe de hachage par ligne, séparés par ":".
Voir ici pour savoir comment le hachage est généré: http://httpd.apache.org/docs/trunk/misc/password_encryptions.html
Votre code serait quelque chose comme ça (non testé):
<?php
$authenticated = false;
// a user and password was supplied
if (isset($_SERVER['PHP_AUTH_USER'])) {
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
$hash = '{SHA}' . base64_encode(sha1($password, TRUE));
$password_file = '/path/to/your/passwords/file';
$lines = file($password_file);
// find the user in the password file
foreach($lines as $line) {
list($_user, $_hash) = explode(":", $line);
if ($_user == $user) {
// if the hash matches, then their password was correct
if ($hash == $_hash) {
$authenticated = true;
}
break;
}
}
}
if (!$authenticated) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'You need to log in to access the downloads';
exit;
}
// log file
$log_file = '/path/to/authentication/logs.log';
$lines = file($log_file);
$time = time();
$mins = 5; // last 5 mins
// write this user to log
$lines[] = $user.":".time();
// remove log entries older then $mins
// also count unique user entries
$unique_users = array();
foreach($lines as $i=>$line) {
list($_user, $_time) = explode(":", $line);
if ($time > $_time + 60*$mins) unset($lines[$i]);
else $unique_users[$user] = isset($unique_users[$user]) ? $unique_users[$user]+1 : 0;
}
// write log file to disk
file_put_contents($log_file, implode("\n", $lines));
// users online
$users_online_count = count($unique_users);
?>
Bien sûr, vous pouvez mettre en œuvre une méthode d'authentification. Vous pouvez utiliser une base de données ou écrire vos propres formats de fichier, etc.