Domanda

Sul nostro sito è presente una directory protetta, in cui gli utenti sono tenuti ad accedere utilizzando il sistema .htacces.

So che possiamo ottenere il nome utente della persona che ha effettuato l'accesso tramite una variabile PHP

  

$ username = $ _SERVER ['REMOTE_USER'];

Mi chiedo se è possibile mostrare TUTTI gli utenti che hanno effettuato l'accesso?

In questo modo potremmo mostrare qualcosa in alto come " Sono registrati i seguenti utenti: "

Inoltre, qualcuno potrebbe chiarire come funzionano le sessioni con htaccess, una persona deve accedere nuovamente solo se chiude il browser o scade? Grazie

È stato utile?

Soluzione

.htaccess L'autenticazione di base è proprio questa: solo autenticazione. Non esiste il concetto di una sessione associata ad essa, e quindi in qualsiasi momento il server non ha idea di quanti client abbiano le credenziali di autenticazione correnti.

Finché un browser ha dettagli di autenticazione, la sessione non scadrà. In genere, solo il riavvio del browser si tradurrà in un browser che "dimentica" i suoi dettagli di autenticazione.

Altri suggerimenti

È vero che BASIC Auth non ha un concetto di sessioni. Tuttavia, le sessioni non sono l'unico modo per autenticare gli utenti o per tenere traccia del numero di utenti che hanno effettuato l'accesso. In effetti, HTTP è senza stato, così come lo sono le sessioni HTTP. Puoi solo indovinare quanti sono connessi tramite il numero di sessioni attive recenti (modificate di recente).

È possibile implementare BASIC Auth con PHP. http://php.net/manual/en/features.http-auth. php

Puoi indovinare quanti sono connessi semplicemente contando il numero di autenticazioni effettuate negli ultimi 5 minuti, o 10 minuti ecc. Ciò sarebbe accurato quanto le sessioni HTTP.

Esempio:

Crea un file chiamato basic-auth.php o simile. Questo è l'esempio di base di 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>";
}
?>

È quindi possibile richiedere () questo file da ogni file / directory che si desidera proteggere. Tuttavia, tutti i download dovranno essere validati da PHP ora. Rimuovi la tua autenticazione di base .htaccess. Dal momento che lo farai PHP.

Ora lo modifichi per autenticare gli utenti.

Una cosa da notare è che BASIC Auth è solo una specifica per l'autenticazione HTTP. Non specifica come eseguire l'autenticazione. Dato che stai usando Apache, il modo in cui esegui l'autenticazione è specifico di Apache. Dovresti aver creato un file di password per Apache, simile a quello menzionato qui: http : //httpd.apache.org/docs/1.3/howto/auth.html#basicconfig

Apache utilizza tre funzioni di hashing. O cripta, md5 o sha1. Quindi, se si desidera utilizzare lo stesso file di password, è necessario sapere quale hash si sta utilizzando.

Ecco un esempio per SHA1:

Fondamentalmente passerai attraverso ogni riga del file della password e, se ha l'utente, controlla se la password fornita corrisponde. Il file è simile al seguente:

user1: passwordhash1 user2: passwordhash2

Che è solo un utente e il relativo hash della password per riga, separati da ": " ;.

Vedi qui per come viene generato l'hash: http://httpd.apache.org/docs/trunk/misc/password_encryptions. html

Il tuo codice sarebbe simile a questo (non testato):

<?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);


?>

Ovviamente, puoi implementare qualsiasi metodo di autenticazione. È possibile utilizzare un database o scrivere i propri formati di file, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top