Перезаписать путь к каталогу на основе данных аутентификации - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь предоставить своим пользователям уникальный каталог под одним общим URL-адресом (https://example.com/sync). Раньше я справлялся с этим с помощью правила перезаписи, которое просто добавляло имя удаленного пользователя в каталог root для «syn c». Теперь идентификатор входа пользователя отличается от имени каталога. Согласно документации apache, authn_dbd предоставляет дополнительно возвращаемые столбцы в дополнительных переменных с префиксом AUTHENTICATE _.

<Directory "/srv/www/sync/">

  AuthDBDUserPWQuery "SELECT passphrase, identifier FROM webserver.fn_authenticate_context('SYNC') where login_id = %s"

  RewriteEngine On
  RewriteCond %{AUTHENTICATE_IDENTIFIER} ^(.+)$
  RewriteRule ^\/(.*)$ /%{AUTHENTICATE_IDENTIFIER}/$1 [NS,L]
</Directory>

Это должно предоставить требуемый идентификатор для моего правила перезаписи. Однако при перезаписи идентификатор кажется недоступным. Добавление заголовка с содержимым к ответу работает и предоставляет содержимое.

Активация журналов до trace8 показывает, что сначала выполняется аутентификация, а затем обрабатываются условия перезаписи, но значение все еще пустое.

1 Ответ

0 голосов
/ 21 июля 2020

После долгих поисков я не нашел надежного способа использовать различные «особенности» Apache dbd. Он производит переменные для дополнительно возвращаемых столбцов - или нет. Переменные доступны в CGI, но не раньше и даже не там. Ошибки регистрируются только на этапе запуска, а затем автоматически удаляются. Поэтому, если вы вообще не получили успешной аутентификации, причиной root может быть проблема с разрешением. Единственный способ проверить это - выполнить запрос с учетными данными, которые dbd использует для доступа к базе данных.

Решение моей исходной проблемы - забыть о задокументированной опции дополнительных столбцов из запроса аутентификации и выполнение дополнительного, отдельного запроса к базе данных. Рабочий сниппет:

### Cloud Synchronization (Web DAV service)

Define _SYNC_CLOUD_PREFIX /sync

# We need the rewrite engine here...
RewriteEngine On

# define a rewrite map which looks up the home directory for the user...
RewriteMap dbd_sync_home "dbd:SELECT dir_home FROM webserver.authorize_for_context('SYNC', %s);"

# redirect /sync to /sync/
RedirectMatch permanent ^${_SYNC_CLOUD_PREFIX}$ ${_SYNC_CLOUD_PREFIX}/

# Rewrite /sync/xxx to /srv/www/sync/<domain>/<user>/xxx
RewriteCond %{LA-U:REMOTE_USER} ^(.+)$
RewriteCond %{REQUEST_URI} ^${_SYNC_CLOUD_PREFIX}
RewriteRule ^${_SYNC_CLOUD_PREFIX}/(.*)$  /srv/www/sync/${dbd_sync_home:%{LA-U:REMOTE_USER}}/$1 [L]

# Authorize when hitting the location /sync/
<Location "${_SYNC_CLOUD_PREFIX}/">
    DAV On
    SSLRequireSSL
    Options +FollowSymLinks

    AuthType Basic
    AuthName "Sync Heaven"

    # To cache credentials, put socache ahead of dbd here
    AuthBasicProvider socache dbd
    AuthnCacheContext www-sync
    AuthnCacheProvideFor dbd

    # mod_authn_dbd SQL query to authenticate a user
    AuthDBDUserPWQuery "SELECT passphrase FROM webserver.authorize_for_context('SYNC', %s);"

    Require method OPTIONS
    Require valid-user
</Location>

UnDefine _SYNC_CLOUD_PREFIX
...