必须使用mysql 8.0.28+版本并启用tls的openldap,配置authentication_ldap_sasl插件、正确设置dn与组映射参数,且需通过三层日志调试认证失败问题。

MySQL 8.0+ 使用 authentication_ldap_sasl 插件连接 OpenLDAP 的前提条件
必须用 MySQL 8.0.28 或更高版本,低版本的 authentication_ldap_simple 不支持绑定用户密码动态传递,且无法对接标准 LDAP DN 模式。OpenLDAP 服务需启用 TLS(ldaps:// 或 start_tls),MySQL 客户端默认拒绝明文 LDAP 连接。
关键配置项要提前确认:
-
plugin_dir路径下存在authentication_ldap_sasl.so(Linux)或authentication_ldap_sasl.dll(Windows) - MySQL 启动时已加载插件:
INSTALL PLUGIN authentication_ldap_sasl SONAME 'authentication_ldap_sasl.so'; - OpenLDAP 的
slapd开放了uid和memberOf属性可读(MySQL 需查用户所属组)
创建 LDAP 映射用户时 CREATE USER 语句的关键参数
不能只写用户名,必须显式指定认证插件、LDAP URL 和基础搜索 DN。MySQL 不会自动推导 LDAP 结构,所有路径都得手写。
典型命令示例:
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_ldap_sasl AS 'uid=alice,ou=people,dc=example,dc=com';
注意以下三点:
-
AS后面不是密码,是 LDAP 中该用户的完整可识别名(DN)——必须与 OpenLDAP 实际条目完全一致,大小写敏感 - 如果 LDAP 用户分散在多个 OU,不能用通配符,得为每个 DN 单独建 MySQL 用户,或改用
authentication_ldap_sasl的 group mapping 模式(见下一条) - 若 LDAP 启用了
refint或memberofoverlay,可配合authentication_ldap_sasl的ldap_server_group_search_attr参数做角色映射
通过 LDAP 组(groupOfNames)控制 MySQL 权限的配置要点
MySQL 本身不解析 LDAP 组权限,必须靠插件的组搜索机制把用户所属组映射成 MySQL 角色(ROLE)。这需要服务端和客户端双向配合。
需设置的系统变量(在 my.cnf 或运行时 SET):
authentication_ldap_sasl_server_host = ldap.example.comauthentication_ldap_sasl_server_port = 636-
authentication_ldap_sasl_bind_base_dn = cn=admin,dc=example,dc=com(用于搜索用户的管理员账号) -
authentication_ldap_sasl_search_attr = uid(登录名字段,对应 MySQL 用户名) -
authentication_ldap_sasl_group_search_attr = memberOf(必须是用户条目中包含组 DN 的属性,OpenLDAP 默认是memberOf,需开启 overlay)
之后创建角色并授权:
CREATE ROLE 'ldap_dev_team';<br>GRANT SELECT, INSERT ON app.* TO 'ldap_dev_team';<br>GRANT 'ldap_dev_team' TO 'alice'@'%';
此时 alice 登录后自动获得该角色权限 —— 但前提是她 LDAP 条目里真有 memberOf: cn=dev-team,ou=groups,dc=example,dc=com 这个值。
调试 authentication_ldap_sasl 失败时最常被忽略的三个日志位置
错误不会直接返回“LDAP 连接失败”,而是表现为 Access denied for user 或卡在握手阶段。必须查三层日志才能定位:
- MySQL 错误日志(
log_error配置路径):搜LDAP bind failed、SASL init error、Can't contact LDAP server - OpenLDAP 服务日志(
/var/log/slapd.log或journalctl -u slapd):看是否有来自 MySQL IP 的 BindRequest 拒绝记录,常见于 TLS 证书不匹配或olcSecurity策略拦截 - MySQL 客户端开启协议追踪:
mysql --debug=d,general,protocol:1,输出里找Authentication plugin 'authentication_ldap_sasl'后的 SASL step 响应码(如0x31表示 LDAP_SUCCESS,0x32是 LDAP_INVALID_CREDENTIALS)
特别注意:MySQL 8.0.33+ 对 SASL EXTERNAL(证书认证)支持仍不稳定,除非明确需要,否则优先用 PLAIN 机制 + TLS 加密传输密码。











