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>
简介
我们的 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>