htaccess를 통해 로그인 한 사용자 목록을 표시하십시오
문제
당사는 당사 사이트에 보호 된 디렉토리가 있으며, 여기서 사용자는 .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);
?>
물론 인증 방법을 구현할 수 있습니다. 데이터베이스를 사용하거나 자신의 파일 형식을 작성할 수 있습니다.