Это правда, что BASIC Auth не имеет понятия сеансов. Тем не менее, сеансы - это не единственный способ аутентификации пользователей или отслеживать, сколько пользователей вошли в систему. Фактически, HTTP является апатридом, а также сеансами HTTP. Вы можете только догадываться, сколько из них зарегистрировано через число последних активных (измененных недавно) сеансов.
Вы можете реализовать BASIC Auth с PHP. http://php.net/manual/en/features.http-auth.php
Вы можете догадаться, сколько из них зарегистрировано, просто подсчитав количество подтверждений за последние 5 минут или 10 минут и т. Д. Это будет точно так же, как и HTTP-сеансы.
Например:
Создайте файл с именем базового auth.php или аналогичный. Это базовый пример из 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>";
}
?>
Вы можете потребовать() этот файл из любого файла/каталога вы хотите защитить. Тем не менее, все загрузки должны быть проверены PHP теперь. Удалите базовую аутентификацию .htaccess. Поскольку у вас будет PHP, сделайте это.
Теперь вы можете отредактировать его, чтобы авторизовать пользователей.
Следует отметить, что BASIC Auth является лишь спецификацией для проверки подлинности HTTP. Он не указывает, как аутентифицироваться. Поскольку вы используете Apache, то, как вы аутентифицируетесь, зависит от Apache. Вы должны были создать файл паролей для Apache, как описано здесь: http://httpd.apache.org/docs/1.3/howto/auth.html#basicconfig
Apache использует три функции хэширования. Или crypt, md5 или sha1. Поэтому, если вы хотите использовать один и тот же файл паролей, вам нужно знать, какой хэш вы используете.
Вот пример для SHA1:
В основном вы будете просто пройти через каждую строку файла паролей, и если у него есть пользователь, проверьте прилагаемый пароль совпадает. Файл выглядит примерно так:
user1: passwordhash1 user2: passwordhash2
который является только один пользователь, и их хэш пароля в строке, разделенные ":".
Смотрите здесь, как генерируется хэш: http://httpd.apache.org/docs/trunk/misc/password_encryptions.html
Ваш код будет что-то вроде этого (непроверенные):
<?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);
?>
Конечно, вы можете реализовать любой метод аутентификации. Вы можете использовать базу данных или написать свои собственные форматы файлов и т. Д.