Это правда, что BASIC Auth не имеет понятия сессий. Однако сеансы - это не единственный способ аутентификации пользователей или отслеживания количества пользователей, вошедших в систему. На самом деле, HTTP не имеет состояния, как и HTTP-сеансы. Вы можете только догадываться, сколько пользователей вошли в систему по количеству последних активных (недавно измененных) сеансов.
Вы можете реализовать BASIC Auth с PHP. http://php.net/manual/en/features.http-auth.php
Вы можете угадать, сколько пользователей вошли в систему, просто посчитав количество аутентификаций, выполненных за последние 5 минут или 10 минут и т. Д. Это будет точно так же, как и сеансы HTTP.
Например:
Создайте файл с именем basic-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 использует три функции хеширования. Либо склеп, 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);
?>
Конечно, вы можете реализовать любой метод аутентификации. Вы можете использовать базу данных или написать свои собственные форматы файлов и т. Д.