Назад | Перейти на главную страницу

Как выполнить скрипт перед базовой аутентификацией Apache?

Мне нужно защитить какое-то место с помощью htpasswd и это работает нормально с:

<Location /myloc>
    AuthType Basic
    AuthName "My Protected Area"
    AuthUserFile .htpasswd
    Require valid-user
</Location>

Но мне нужно как-то обойти этот Auth, например, для url / myloc / loc1, но не для / myloc / loc2. Причина этого в том, что я хочу получить, например, loc1 и выполнить поиск в БД. Например:

"select Status From table where url=/myloc/requested_loc" (loc1 or loc2 or any name)
if Status == 1
   return 1
else 
   return 0

Итак, сценарии следующие:

  1. выполнить скрипт перед тем, как браузеры запросят пользователя / пароль
  2. если сценарий возвращает 0, приглашение для пользователя / прохода, если сценарий возвращает 1, не запрашивает пользователя / пароль и открытое местоположение

Некоторые идеи: 1. Подумывал доработать https://github.com/winlibs/apache/blob/master/2.4.x/modules/aaa/mod_auth_basic.c но я не уверен, что это хорошая идея (я уверен, что это ужасная идея).

  1. Чтобы иметь какой-нибудь ScriptAlias ​​/ myloc /opt/script.py, который будет проверять, что мне нужно в базе данных, а затем, если 1 открытое местоположение, если 2, отправить в браузер, требуется 401 auth.

И на этом мои идеи заканчиваются.

Я не ищу решения, просто несколько идей, в каком направлении это делать.

РЕШЕНИЕ И ОБНОВЛЕНИЕ

Я настолько глуп, что вообще не буду использовать Auth на / myloc. Я сделаю Auth для динамически создаваемых файлов loc1.conf, loc2.conf и так далее, а затем включу это в конфигурацию виртуального хоста apache.

<VirtualHost *:80>
  domain 
  ......
  Include /path/loc1.conf
  Include /path/loc2.conf
  ....
</VirtualHost>

@HBruijn дал мне эту идею.

Вам нужно выяснить, как Apache объединяет директивы и устанавливает приоритет.

<Location> разделы обрабатываются в том порядке, в котором они появляются в файле конфигурации, поэтому что-то вроде следующего должно позволить неавторизованным / неаутентифицированным посетителям получить доступ к / myloc / loc1 /:

<VirtualHost *:80>
    ServerName example.org
    DocumentRoot /var/www/

    <Location /myloc/loc1/>   
            Order allow,deny
            Allow from all
    </Location> 
    <Location /myloc/>   
            AuthType Basic
            AuthName "My Protected Area"
            AuthUserFile .htpasswd
            Require valid-user
    </Location> 
</VirtalHost>

Из Apache 2.3 вы можете использовать контейнеры авторизации для выражения более сложной логики авторизации.