показывать список зарегистрированных пользователей через htaccess

StackOverflow https://stackoverflow.com/questions/1609559

  •  05-07-2019
  •  | 
  •  

Вопрос

У нас есть защищенный каталог на нашем сайте, где пользователи должны входить в систему с помощью системы .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);


?>

Конечно, вы можете реализовать любой метод аутентификации.Вы могли бы использовать базу данных, написать свои собственные форматы файлов и т.д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top