Динамические области аутентификации в Apache
У меня есть сервер переднего плана, выступающий в качестве прокси шлюза для многих (динамических "многих") строительных мониторов со встроенными веб-серверами.
Доступ к ним осуществляется по URL-адресу:
http://www.example.com/monitor1/
http://www.example.com/monitor2/
...
Я пытаюсь ограничить доступ к этим мониторам только тем пользователям, которым они принадлежат. Так что мне нужен способ указать права для пользователей или групп для определенных каталогов.
Стандартные механизмы аутентификации, которые я вижу в Apache, не будут работать, потому что мне нужно указать каждое местоположение. Я бы предпочел динамическую карту или скрипт.
Какие-либо предложения?
1 ответ
Хорошо, вот быстрый и (очень) хакерский способ сделать это. Короче говоря, нет способа (который я знаю) динамически делать то, что вы просите, с помощью стандартных инструментов Apache. Необходимы дополнительные модули или код. Кто-то там, возможно, уже сделал модуль, который делает то, что вы хотите. Я не пошел смотреть.
Установите и включите mod_perl в вашей конфигурации Apache, затем поместите этот блок в любое место вашей конфигурации после LoadModule для perl. Это не должно быть в каком-либо VirtualHost или Каталоге или чем-то в этом роде.
<Perl>
use Apache2::ServerUtil qw//;
use Apache2::RequestRec qw//;
use Apache2::RequestUtil qw//;
use Apache2::Const qw/OK DECLINED/;
my $s = Apache2::ServerUtil->server;
$s->push_handlers(PerlHeaderParserHandler => sub { my($r) = @_;
if ( $r->hostname eq 'www.example.com' &&
$r->uri =~ m|^/(monitor\d+)/$| ) {
my $monitorDirectory = $1;
eval{$r->add_config([
"AuthType basic",
"AuthName 'secret $monitorDirectory'",
"AuthUserFile /path/to/user/file",
"require user $monitorDirectory"
])};
if ( $@ ) { warn $@ }
return OK;
} else {
return DECLINED;
}
});
</Perl>
В основном, это то, что он делает, смотрит URL каждого запроса и, если он совпадает, вставляет некоторые правила конфигурации на лету перед этапом аутентификации и авторизации запроса. Чтобы изменить его, измените www.example.com
немного, регулярное выражение ^/(monitor\d+)/$
и список директив для вставки.
Это позволит вам сохранить файл пользователя, где имя пользователя - это имя каталога из URL. Если вы хотите, чтобы в каталоге было несколько пользователей, вам придется использовать группы и поддерживать этот файл. Для этого измени require user $monitorDirectory
в require group $monitorDirectory
и добавить AuthGroupFile /path/to/group/file
,