2009-10-22 5 views
0

Nous avons un répertoire protégé sur notre site, où les utilisateurs sont tenus de se connecter en utilisant le système .htacces.montre une liste des utilisateurs connectés via htaccess

Je sais que nous pouvons obtenir le nom d'utilisateur de la personne des thats connecté par une variable PHP

$ username = $ _SERVER [ 'REMOTE_USER'];

Je me demande s'il est possible de montrer tous les utilisateurs connectés?

De cette façon, nous pourrions montrer quelque chose en haut comme « Les utilisateurs suivants sont connectés: »

Aussi, quelqu'un pourrait expliquer comment les séances de travail avec htaccess, une personne ne suffit de vous reconnecter si elles fermez le navigateur ou expire-t-il? Merci

Répondre

1

.htaccess L'authentification de base est juste cette authentification seulement. Il n'y a pas de concept de session associée, et ainsi, à un moment donné, le serveur n'a aucune idée du nombre de clients ayant des informations d'identification en cours.

Tant que le navigateur dispose de détails d'authentification, la session n'expire pas. En règle générale, seul le redémarrage du navigateur entraîne l'oubli des détails de l'authentification par le navigateur.

1

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.

Questions connexes