Настройка Apache2 с помощью mod_userdir
и mod_authnz_external and pwauth
, чтобы каждый пользователь мог получить доступ к своему домашнему компьютеру и мог пройти аутентификацию с помощью своих локальных учетных данных UNIX.
Теперь мне нужна какая-то авторизация, чтобы каждый пользователь после аутентификации мог получить доступ только к своему домашнему каталогу, но не к домашним каталогам других пользователей.
Предупреждение: в моей настройке пользователь не обязательно является владельцем своего домашнего каталога, поэтому mod_authz_owner
здесь это не сработает.
Еще одна проблема: %{REMOTE_USER}
переменная, установленная Apache, не может использоваться внутри <If >
директив (или других директив, которые могли бы здесь помочь), поскольку аутентификация выполняется поздно, во время обработки запроса.
Как мне достичь своей цели с помощью Apache2? Есть ли, например, возможность извлечь имя домашнего каталога пользователя %{REQUEST_URI}
и передать его в
Require user ...
директиву? Я не смог найти, как это сделать, поэтому любая помощь будет оценена по достоинству.
решение1
Вам нужно будет написать свой собственный скрипт аутентификатора. Вы должны быть в состоянии сделать это довольно легко, не написав много кода.
Apache передает запрашиваемый URI скрипту аутентификатора через переменную среды, поэтому вам нужно вызватьpwauthиз вашего скрипта для проверки комбинации имени пользователя и пароля, а затем сравнения указанного имени пользователя с URI, чтобы убедиться, что имя пользователя, пароль которого вы только что проверили, содержится в запрашиваемом URI.
Вот документация, которая мне очень помогла, когда я писал свой аутентификатор. https://github.com/phokz/mod-auth-external/blob/master/mod_authnz_external/АУТЕНТИФИКАТОРЫ
Рабочая реализация аутентификатора на 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