我试图为我的用户提供一个通用网址(https://example.com/sync)下的唯一目录。在此之前,我使用重写规则来管理它,它只是将远程用户名附加到"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的日志显示,首先处理身份验证,然后处理重写条件,但该值仍然为空。
发布于 2020-07-22 02:43:03
在寻找了很长一段时间后,我发现没有可靠的方法来使用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_PREFIXhttps://stackoverflow.com/questions/62849473
复制相似问题