根据身份验证数据重写目录路径

时间:2020-07-11 12:59:59

标签: apache url-rewriting dbd

我正在尝试在一个公共URL(https://example.com/sync)下为我的用户提供一个唯一的目录。以前,我使用重写规则来管理此问题,该规则只是将远程用户名附加到根目录中以进行“同步”。现在,用户登录ID与目录名称不同。根据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 :(得分:0)

搜索了一段时间后,我发现没有可靠的方法来使用Apache dbd的不同“功能”。它会为另外返回的列生成变量-是否生成。变量在CGI中可用,但之前没有,甚至没有。错误仅在启动阶段记录下来,随后被静默丢弃。因此,如果您根本没有获得成功的身份验证,则根本原因可能是权限问题。验证这一点的唯一方法是使用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