Pergunta

Temos um diretório protegido em nosso site, onde os usuários são obrigados a faça o login usando o sistema Htacces.

Eu sei que podemos obter o nome de usuário da pessoa isso é logado através de uma variável PHP

$ username = $ _SERVER [ 'REMOTE_USER'];

Eu estou querendo saber se é possível mostrar todos os usuários logado?

Desta forma, poderíamos mostrar algo no topo como "Os seguintes usuários está logado:"

Além disso, alguém poderia esclarecer como as sessões de trabalho com htaccess, é que uma pessoa só tem que re-login, se fechar o browser, ou será que o tempo limite? Graças

Foi útil?

Solução

.htaccess autenticação básica é apenas isso - apenas a autenticação. Não existe o conceito de uma sessão associada a ele, e, portanto, em qualquer ponto no tempo o servidor não tem idéia de quantos clientes têm credenciais de autenticação atuais.

Enquanto um navegador tem detalhes de autenticação, a sessão não será tempo limite. Normalmente, apenas reiniciar o navegador irá resultar em um navegador 'esquecer' É detalhes de autenticação.

Outras dicas

É verdade que BASIC Auth não tem noção de sessões. No entanto, as sessões não é a única maneira de usuários autenticados, ou para manter o controle de quantos usuários está logado. Na verdade, HTTP é apátrida, e assim é HTTP Sessions. Você só pode adivinhar quantos está logado através do número de recentes ativos (modificado recentemente) sessões.

Você pode implementar BASIC Auth com PHP. http://php.net/manual/en/features.http-auth. php

Você pode adivinhar quantos se identificou apenas pela contagem do número de autenticações feitas nos últimos 5 minutos, ou 10 minutos etc. Isso seria tão preciso quanto HTTP sessões.

Por exemplo:

Crie um arquivo chamado-auth.php básico ou similar. Este é o exemplo básico de 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>";
}
?>

Você pode então require () este arquivo de cada arquivo / diretório que deseja proteger. No entanto, todos os downloads terá de ser validada pelo PHP agora. Retire o seu autenticação básica .htaccess. Desde que você vai ter PHP fazê-lo.

Agora você modificá-lo para usuários autheticate.

Uma coisa a notar é que BASIC Auth é apenas uma especificação para a autenticação HTTP. Ele não especifica como autenticar. Desde que você está usando Apache, como a autenticação é específico para Apache. Você deveria ter criado um arquivo de senha para o Apache, semelhante ao mencionado aqui: http : //httpd.apache.org/docs/1.3/howto/auth.html#basicconfig

O Apache usa três funções hash. De qualquer cripta, MD5 ou SHA1. Então, se você quiser usar o mesmo arquivo de senhas, então você precisa saber o que de hash que você está usando.

Aqui está um exemplo para SHA1:

Basicamente você só vai passar por cada linha do arquivo de senha, e se ele tem o usuário, verifique se as partidas senha fornecida. O arquivo é algo como:

user1: passwordhash1 user2: passwordhash2

Que é apenas um usuário e seu hash de senha por linha, separados por ":".

Veja aqui como o hash é gerado: http://httpd.apache.org/docs/trunk/misc/password_encryptions. html

Seu código seria algo parecido com isto (não testado):

<?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);


?>

Claro, você pode implementar qualquer método de autenticação. Você poderia usar um banco de dados ou escrever seus próprios formatos de arquivo, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top