mod_authz_dbd仅负责授权,不处理认证,必须搭配mod_authn_dbd等认证模块;authdbduserpwquery返回列名必须为password(大小写敏感),密码格式须为明文、{plain}、{sha}、{ssha}或{bcrypt},且require dbd-group查询须返回单列无空格组名。

mod_authz_dbd 本身不处理登录认证,只做授权;要实现“数据库动态授权”,必须搭配 mod_authn_dbd(负责查密码)或外部认证机制,否则用户连门都进不来。
AuthDBDUserPWQuery 返回的密码字段名必须是 password(大小写敏感)
Apache 不会报错,但只要列名不是 password,就会静默拒绝所有请求——这是最常卡住人的地方。
- 错误写法:
SELECT passwd FROM users WHERE username = %s(返回列叫passwd) - 正确写法:
SELECT passwd AS password FROM users WHERE username = %s(显式别名) - 密码值必须符合 Apache 要求格式:明文、
{PLAIN}、{SHA}、{SSHA}或{bcrypt};MySQL 的SHA2()函数结果不能直接用,得套{SHA256}...前缀 - 用
LogLevel authn_dbd:debug查看实际返回值,比翻日志猜快得多
Require dbd-group 查询必须返回单列字符串(组名),且不能有空格或换行
哪怕数据库里多一个不可见字符(比如末尾换行、BOM、全角空格),Require dbd-group admin 就会失效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 推荐写法:
AuthzDBDQuery "SELECT TRIM(group_name) FROM user_groups WHERE username = %s" - 避免 SELECT 多列、COUNT(*)、CASE WHEN 等非单字符串结果
- 如果用户属于多个组,查询应返回多行(每行一个组名),Apache 会逐行匹配
Require dbd-group - SQLite 用户注意:
TRIM()在旧版 SQLite 中不存在,可用REPLACE(REPLACE(group_name, CHAR(10), ''), CHAR(13), '')替代
DBD 连接配置失败时 Apache 启动不报具体错误,只显示 “DBD: failed to initialise”
这通常不是 SQL 写错了,而是底层驱动或权限没到位。
-
LoadModule dbd_module modules/mod_dbd.so和LoadModule authz_dbd_module modules/mod_authz_dbd.so必须同时存在,且dbd_module加载顺序必须在前 - Ubuntu/Debian 需装
libaprutil1-dbd-mysql(或-pgsql),CentOS/RHEL 是apr-util-mysql(或apr-util-pgsql) -
DBDriver值必须与已安装驱动严格一致:写mysql却只装了 pgsql 驱动,就会失败 - SQLite 路径必须绝对,且 Apache 进程(如 www-data 或 apache)对文件和父目录都有读写权限;
/tmp下的 DB 文件在某些系统上会被 SELinux 或 systemd-tmpfiles 拒绝
“验证通过但每次都要重输密码”其实是 realm 不一致或 Authorization 头被剥离
mod_authz_dbd 不管 session,它只响应单次请求。所谓“反复登录”,基本都是客户端没持续发凭据,或服务端没认出来是同一个域。
-
AuthName必须带英文双引号且完全一致,比如AuthName "Intranet";前后少个空格、大小写不同,浏览器就当全新 realm 处理 - Nginx 反向代理 Apache 时,默认不透传
Authorization头,需加proxy_set_header Authorization $http_authorization; - PHP-FPM 或 CGI 模式下,
Authorization头可能被 Apache 剥离;检查是否启用了SetEnvIf规则或CGIPassAuth On缺失 - 用
curl -v -u user:pass https://yoursite.com/protected/直连 Apache 测试,排除前端干扰
真正麻烦的不是写 SQL,而是数据库返回值的“肉眼不可见差异”——空格、换行、编码、大小写、字段别名,Apache 全部严格校验,且几乎不提示。调试时优先开 debug 日志,而不是改配置重启十次。










