authz_dbd,通过 .htaccess 进行多用户身份验证和单个文件夹

authz_dbd, multi user authentication and individual folders through .htaccess

简介

我们的 apache2 设置使用 webdav 提供来自各种文件夹的文件,并使用 authz_dbd 与 mysql 数据库通信(这部分工作没有问题)。

总结: Apache2、mod_authz_dbd、mod_authn_dbd、mysql、启用 webdav、多用户环境(物联网节点)。

但是...其中一些文件夹是用户特定的。

folder1              admins
+--subfolder1.1      admins+some other folk+user1
+--subfolder1.2      admins+again other folk+user1
folder2
+--subfolder 2.1     same as 1.1 but with user2
+--subfolder 2.2     as1.2.. but..user2

我们使用带通配符的dbd-groups,类似这样:

location /var/www/html/*/subfolder1.1 
 require dbd-group read

通常都写在 vhosts 文件中

(require user.. )

问题

这变得太大了,我们需要另一个修复。

我们不能将 .htaccess 文件与 dbd 组结合使用(.htacces 中不允许使用 dbd 组)。我们的 debian (jessy) 不允许其他 mysql apache2 模组。

.htaccess 文件与 dbd 的 mysql 授权的组合不起作用(.htaccess 中不允许使用 dbd 组)。 我们的 debian 服务器不允许其他 mysql apache2 模组(例如 mod_auth_mysql)。

如何将 mysql 权限与文件夹特定用户结合起来?

好的,我相信我已经破解了它:

技术

Apache 原生支持命名组和反向引用。 捕获组可用于识别文件夹(以及用户)。

这是如何工作的;

托管目录的每个子目录 (/var/www/web) 以 M 开头且至少包含三位小数 (M\d{3,}) <- 捕获组。 这存储在一个变量 (sitedir)

例如

/var/www/web/M1234/etc. sitedir=M1234
/var/www/web/M1234567/test/ANY other directory sitedir=M1234567

在我的例子中,我将用户与目录名称匹配 require user %{env:MATCH_SITEDIR}

请注意在 require 指令之外使用查询(如下所示)。

使用级联RequireAny/Requireall其他需求可以做 (对 dbd 组、ip 限制等的要求)。

缺点

捕获组可能允许使用一个 Mcode 的多个文件夹。 这可以通过调整捕获组来缓解。

捕获的文件夹名称不能在查询中使用(不允许这样做) 这会更好,但它不起作用......(变量被认为是纯文本)。

工作示例

   <DirectoryMatch /var/www/web/(?<sitedir>(M\d{3,}))>
        AuthDBDUserPWQuery "SELECT password FROM mysql_auth WHERE username = %s"
        AuthzDBDQuery "SELECT groups FROM mysql_auth WHERE username = %s"
        <RequireAny>
                Require user %{env:MATCH_SITEDIR}
                <RequireAll>
                    Require valid-user
                    Require ip 10.0.0.0/16
                    <RequireAny>
                        Require dbd-group internal
                        Require dbd-group write
                    </RequireAny>
                </RequireAll>
        </RequireAny>   
   </DirectoryMatch>