Динамический AuthUserFile в apache с mod_rewrite. Является ли это возможным?
У меня есть сервер с несколькими учетными записями scponly, и я хочу предоставить http-доступ в режиме Basic Auth.
Первая часть проблемы решена, используя mod_rewrite, чтобы расколоть и выбрать правильный каталог для каждого пользователя. Но проблема возникает, когда я пытаюсь установить разные файлы аутентификации для каждого пользователя. Просто я не могу найти, как это сделать.
Вот пример конфигурации.
<VirtualHost an-ip-number-and:a-port>
ServerName *.example.com
RewriteEngine On
UseCanonicalName Off
RewriteCond %{HTTP_HOST} ^(.*).example.com
RewriteCond /server/scponly/%1/incoming -d
RewriteRule ^(.+) %{SERVER_NAME}$1 [C]
RewriteRule ^([^.]+)\.example\.com/(.*) /server/scponly/$1/incoming/$2 [L]
RewriteRule ^(.+) http://FAIL.example.com
<Directory /server/scponly/*/incoming>
AuthType Basic
AuthName "SFTP-HTTP Area"
AuthUserFile ??????? # <-- this!
require valid-user
</Directory>
</VirtualHost>
Заметки:
- Я не могу удалить mod_rewrite, потому что фактическая конфигурация смешана с другим именем сервера / каталог-проверки / перезаписывает для других целей.
- Я не могу переместить данные аутентификации в файлы.htaccess, потому что пользователи могут их стереть. Но мне интересно, будет ли такой подход частичным решением.
- Я также заинтересован в других подходах
- Мне нужны разные файлы аутентификации для каждого каталога, поскольку только один файл предоставит доступ ко всем каталогам для каждого пользователя
2 ответа
Чтобы расширить ответ peelman, у вас должен быть отдельный раздел для каждого пользователя:
<Directory /server/scponly/*/incoming>
AuthType Basic
AuthName "SFTP-HTTP Area"
AuthUserFile /path/to/user/htpasswd
</Directory>
<Directory /server/scponly/bob/incoming>
require user bob
</Directory>
<Directory /server/scponly/smith/incoming>
require user smith
</Directory>
Радикальным подходом будет использование mod_perl, который позволяет вам настроить apache с помощью perl. Это будет в конфигурационном файле Apache:
<Perl>
for $dir (glob "/server/scponly/*/incoming") {
($user) = $dir =~ m%/server/scponly/([^/]+)/incoming%;
exists $Directory{$dir} or $Location{$dir} = { };
$Directory{$dir}{AuthType} = 'Basic';
$Directory{$dir}{AuthName} = 'SFTP-HTTP Area';
$Directory{$dir}{AuthUserFile} = '/path/to/htpasswd';
$Directory{$dir}{require} = "user $user";
}
</Perl>
(Написано с макушки головы.)
А? Вы можете иметь только один файл. Вам просто нужно изменить параметр Require, чтобы он стал идентификатором пользователя вместо valid-user. Смотрите здесь: Apache Docs.