문제

당사는 당사 사이트에 보호 된 디렉토리가 있으며, 여기서 사용자는 .htacces 시스템을 사용하여 로그인해야합니다.

PHP 변수를 통해 로그인 한 사람의 사용자 이름을 얻을 수 있다는 것을 알고 있습니다.

$ username = $ _server [ 'remote_user'];

모든 사용자가 로그인 한 것을 보여줄 수 있는지 궁금합니다.

이런 식으로 우리는 "다음 사용자가 로그인됩니다."와 같은 상단에 무언가를 보여줄 수 있습니다.

또한, 누군가가 세션이 htaccess와 어떻게 작동하는지 명확히 할 수 있거나, 사람은 브라우저를 닫는 경우에만 다시 로그를해야합니까, 아니면 시간이 오래 걸리나요? 감사

도움이 되었습니까?

해결책

.htaccess 기본 인증은 단지 인증 만 있습니다. 이와 관련된 세션의 개념은 없으므로 어느 시점에서 어느 시점에 서버는 현재 인증 자격 증명을 가지고있는 클라이언트 수를 모릅니다.

브라우저에 인증 세부 사항이있는 한 세션은 시간이 오래 걸리지 않습니다. 일반적으로 브라우저를 다시 시작하면 브라우저가 '잊어 버리기'가 인증 세부 사항입니다.

다른 팁

기본 인증에는 세션 개념이 없다는 것은 사실입니다. 그러나 세션이 사용자를 인증하거나 로그인 한 사용자 수를 추적하는 유일한 방법은 아닙니다. 실제로 HTTP는 무국적이며 HTTP 세션도 마찬가지입니다. 최근 활성 (최근 수정) 세션 수를 통해 로그인 한 수를 추측 할 수 있습니다.

PHP로 기본 인증을 구현할 수 있습니다. http://php.net/manual/en/features.http-auth.php

지난 5 분 동안 이루어진 인증 수를 계산하여 로그인 한 수를 추측 할 수 있습니다. 이는 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가 할 수 있기 때문에 당신은 당신이 그것을 할 것입니다.

이제 사용자를 인증하기 위해 수정합니다.

주목할만한 점은 기본 인증은 HTTP 인증을위한 사양 일 뿐이라는 것입니다. 인증 방법을 지정하지 않습니다. Apache를 사용하고 있으므로 인증 방법은 Apache에 따라 다릅니다. 여기에 언급 된 것과 유사한 Apache 용 비밀번호 파일을 만들어야합니다. http://httpd.apache.org/docs/1.3/howto/auth.html#basicconfig

Apache는 세 가지 해싱 함수를 사용합니다. crypt, 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);


?>

물론 인증 방법을 구현할 수 있습니다. 데이터베이스를 사용하거나 자신의 파일 형식을 작성할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top