показать список авторизованных пользователей через htaccess - PullRequest
0 голосов
/ 22 октября 2009

У нас есть защищенный каталог на нашем сайте, куда пользователи должны войти, используя систему .htacces.

Я знаю, что мы можем получить имя пользователя, который вошел в систему через переменную PHP

$ username = $ _SERVER ['REMOTE_USER'];

Мне интересно, возможно ли показывать ВСЕХ пользователей, вошедших в систему?

Таким образом, мы могли бы показать что-то вверху, как «Следующие пользователи вошли в систему:»

Кроме того, кто-то может прояснить, как сеансы работают с htaccess, нужно ли повторно входить в систему, только если он закрывает браузер, или время ожидания истекло? Спасибо

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

.htaccess Basic Authentication - это всего лишь аутентификация. Не существует понятия сеанса, связанного с ним, и поэтому в любой момент времени сервер не знает, сколько клиентов имеют текущие учетные данные для аутентификации.

Пока в браузере есть данные для аутентификации, время сеанса не истечет. Как правило, только перезапуск браузера приводит к тому, что браузер «забывает» свои данные аутентификации.

1 голос
/ 23 октября 2009

Это правда, что 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);


?>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...