показывать список зарегистрированных пользователей через htaccess
Вопрос
У нас есть защищенный каталог на нашем сайте, где пользователи должны входить в систему с помощью системы .htacces.
Я знаю, что мы можем получить имя пользователя, вошедшего в систему, через переменную PHP
$username = $_SERVER['УДАЛЕННЫЙ ПОЛЬЗОВАТЕЛЬ'];
Мне интересно, возможно ли показать ВСЕХ вошедших в систему пользователей?
Таким образом, мы могли бы показать вверху что-то вроде "Следующие пользователи вошли в систему:"
Кроме того, не мог бы кто-нибудь уточнить, как сеансы работают с htaccess, нужно ли человеку повторно входить в систему только в том случае, если он закрывает браузер, или истекло время ожидания?Спасибо
Решение
.htaccess Basic Authentication - это всего лишь аутентификация. Понятие сеанса, связанного с ним, отсутствует, и поэтому в любой момент времени сервер не знает, сколько клиентов имеют текущие учетные данные для аутентификации.
Пока в браузере есть данные для аутентификации, время сеанса не истечет. Как правило, только перезапуск браузера приводит к тому, что браузер «забывает» свои данные аутентификации.
Другие советы
Это правда, что BASIC Auth не имеет понятия о сеансах.Однако сеансы - не единственный способ аутентификации пользователей или отслеживания того, сколько пользователей вошли в систему.Фактически, HTTP не имеет состояния, как и HTTP-сеансы.Вы можете только догадываться, сколько из них вошли в систему, по количеству последних активных (недавно измененных) сеансов.
Вы можете реализовать БАЗОВУЮ аутентификацию с помощью 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 использует три функции хеширования.Либо crypt, md5, либо sha1.Поэтому, если вы хотите использовать один и тот же файл паролей, вам нужно знать, какой хэш вы используете.
Вот пример для SHA1:
По сути, вы просто просматриваете каждую строку файла паролей, и если в нем есть пользователь, проверьте, совпадает ли указанный пароль.Файл выглядит примерно так:
пользователь1: пароль hash1 пользователь2: пароль hash2
Это всего лишь один пользователь и хэш его пароля в строке, разделенные символом ":".
Смотрите здесь, как генерируется хэш: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);
?>
Конечно, вы можете реализовать любой метод аутентификации.Вы могли бы использовать базу данных, написать свои собственные форматы файлов и т.д.