mysql 8.0+ ldap认证需启用authentication_ldap_sasl插件,用户须显式创建并绑定dn,客户端连接需指定--default-auth,权限需单独授予,且jdbc需配置allowpublickeyretrieval=true。
mysql 8.0+ 连接 ldap 认证服务器时 mysql_native_password 插件不生效
ldap 认证依赖 authentication_ldap_sasl 插件,不是传统密码插件。如果客户端仍用 mysql -u user -p 尝试走本地密码验证,会直接报 access denied for user,哪怕 ldap 账号本身是有效的。
实操建议:
- 确认服务端已加载插件:
INSTALL PLUGIN authentication_ldap_sasl SONAME 'authentication_ldap_sasl.so'(Linux)或.dll(Windows) - 用户必须显式绑定 LDAP 认证方式:
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_ldap_sasl BY 'uid=alice,ou=people,dc=example,dc=com' - 客户端连接时不能省略
--plugin-dir和--default-auth参数,否则默认用mysql_native_password插件协商,必然失败
MySQL 客户端连接 LDAP 时提示 Plugin 'authentication_ldap_sasl' is not loaded
这个错误不是客户端问题,而是服务端插件没启用或路径不对。客户端只是把服务端返回的认证要求转达给你,它自己不加载插件。
实操建议:
- 检查服务端插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'authentication_ldap_sasl',必须为ACTIVE -
plugin_dir配置需指向真实插件路径,例如 Linux 下通常是/usr/lib/mysql/plugin/,但 Docker 官方镜像默认不包含该插件,需手动挂载或构建镜像 - 某些发行版 MySQL(如 Percona Server)可能用
authentication_ldap_simple替代,函数名和配置项不兼容,不能混用
Java 应用用 JDBC 连接 LDAP 认证 MySQL 报 Public Key Retrieval is not allowed
这不是 LDAP 相关错误,而是 JDBC 驱动在开启 SSL 或使用 SHA256 密码交换时的默认保护机制。LDAP 认证流程中,MySQL 服务端可能触发公钥交换阶段,而驱动默认禁用该行为。
实操建议:
- 连接 URL 必须显式加参数:
?allowPublicKeyRetrieval=true&useSSL=false(测试环境),生产环境应配好 TLS 证书并设useSSL=true - 驱动版本很重要:MySQL Connector/J 8.0.28+ 对 SASL 认证支持更稳,旧版(如 5.1.x)根本不识别
authentication_ldap_sasl - 如果用 HikariCP 等连接池,
dataSource.setConnectionInitSql("SET @dummy = 0")不能绕过认证握手,无效
LDAP 用户登录成功但执行 SQL 报 Access denied for table
LDAP 只管身份认证,不自动赋予权限。用户通过 DN 登录后,仍是空权限状态,和本地用户一样需要显式授权。
实操建议:
- 权限授予必须用完整用户名+主机:
GRANT SELECT ON mydb.* TO 'alice'@'%',注意这里不是 LDAP DN 字符串,而是 CREATE USER 时定义的用户名 - 不要混淆
IDENTIFIED WITH的值和授权对象名 —— 前者是认证凭据(如 DN),后者是 MySQL 内部标识符 - 若用通配符主机(如
'%'),确保skip_name_resolve = OFF,否则反向 DNS 查找失败可能导致权限匹配异常
LDAP 认证的麻烦点不在连接本身,而在服务端插件加载、客户端协议协商、权限模型这三者的错位。最容易被忽略的是:你以为连上了,其实只是认证握手卡在中间某步,日志里却只显示“Access denied”——这时候得翻 mysqld.err,而不是重试密码。











