mod_userdir
및 를 사용하여 Apache2를 설정 mod_authnz_external and pwauth
하면 각 사용자가 자신의 홈에 액세스하고 로컬 UNIX 자격 증명으로 인증할 수 있습니다.
이제 각 사용자가 인증된 후 자신의 홈 디렉토리에만 액세스할 수 있고 다른 사용자의 홈 디렉토리에는 액세스할 수 없도록 일종의 인증이 필요합니다.
주의 사항: 내 설정에서는 사용자가 반드시 홈 디렉토리의 소유자일 필요는 없으므로 mod_authz_owner
여기서는 작동하지 않습니다.
또 다른 문제: Apache가 설정한 변수 는 요청 처리 중에 인증이 늦게 이루어지기 때문에 지시어(또는 여기에 도움이 될 수 있는 다른 지시어) %{REMOTE_USER}
내에서 사용할 수 없습니다 .<If >
Apache2로 목표를 어떻게 달성할 수 있나요? 예를 들어 사용자 홈 디렉토리 이름을 추출 %{REQUEST_URI}
하여 지시문에 전달할 가능성이 있습니까 Require user ...
? 이 작업을 수행하는 방법을 찾을 수 없었으므로 도움을 주시면 감사하겠습니다.
답변1
자체 인증자 스크립트를 작성해야 합니다. 많은 코드를 작성하지 않고도 꽤 쉽게 할 수 있어야 합니다.
Apache는 요청되는 URI를 환경 변수를 통해 인증자 스크립트에 전달하므로 다음을 호출해야 합니다.읏스크립트에서 사용자 이름/비밀번호 조합의 유효성을 검사한 다음 주어진 사용자 이름을 URI와 비교하여 방금 확인한 비밀번호의 사용자 이름이 요청 중인 URI에 있는지 확인하세요.
다음은 제가 직접 인증자를 작성할 때 매우 도움이 되는 문서입니다. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/AUTHENTICATORS
PHP에서 인증자 구현 작업:
#!/usr/bin/php
<?php
// Get the user name
$user = trim(fgets(STDIN));
// Get the password
$pass = trim(fgets(STDIN));
// Call pwauth to validate user and password combination
$handle = popen('/usr/sbin/pwauth', 'w');
fwrite($handle, $user."\n".$pass."\n");
if (pclose($handle) === 0) { // Password is valid for user
// Check if the URI belongs to the user
$uri = getenv('URI');
if (preg_match('#^/~'.$user.'/#', $uri)
|| preg_match('#^/~'.$user.'$#', $uri)) {
exit(0); // User matches requested URI
}
else exit(1); // User does not match requested URI
}
exit(1); // Password is not valid for user