0

介绍

我们的 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 mods。

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

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

4

1 回答 1

0

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

技术

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> 
于 2016-09-13T08:57:42.047 回答