Динамические области аутентификации в 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,

Другие вопросы по тегам