必须执行install plugin validate_password soname 'validate_password.so'启用插件,再用set persist持久化配置policy、length等参数,否则密码策略不生效。

MySQL 8.0+ 自带 validate_password 插件怎么启用?
MySQL 8.0 起默认内置 validate_password 插件,但多数安装默认未激活。不启用就完全不校验密码强度,哪怕你设了 validate_password.length 也没用。
执行以下命令确认状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
如果返回空或 DISABLED,需手动安装:
-
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux/macOS) -
INSTALL PLUGIN validate_password SONAME 'validate_password.dll';(Windows) - 若报错 “Plugin 'validate_password' is not loaded”,说明插件文件缺失——检查
plugin_dir路径(SHOW VARIABLES LIKE 'plugin_dir';),确认对应 .so/.dll 文件存在
关键参数怎么设才真正生效?
插件启用后,仅靠默认配置几乎没约束力:validate_password.length 默认是 8,但 validate_password.policy 默认是 MEDIUM,而 MEDIUM 要求必须含大小写字母+数字+特殊字符——这点常被忽略,导致用户创建密码时莫名其妙失败。
常用参数设置示例(全部用 SET PERSIST 持久化):
-
SET PERSIST validate_password.policy = 'MEDIUM';(可选LOW/MEDIUM/STRONG) -
SET PERSIST validate_password.length = 12;(实际生效长度 = max(length, 各策略最低要求,如MEDIUM要求至少 8) -
SET PERSIST validate_password.number_count = 2;(MEDIUM/STRONG 下强制要求的数字个数) -
SET PERSIST validate_password.mixed_case_count = 2;(大小写字母总和下限) -
SET PERSIST validate_password.special_char_count = 1;(特殊字符个数)
注意:STRONG 策略还会调用字典检查(需额外配置 validate_password.dictionary_file),但该文件默认为空,不配等于没用。
CREATE USER 或 ALTER USER 时触发校验的边界情况
密码校验只在显式设置密码时触发,不是所有操作都管:
- ✅
CREATE USER 'u'@'%' IDENTIFIED BY 'p@ssw0rd'; - ✅
ALTER USER 'u'@'%' IDENTIFIED BY 'newP@ss123'; - ❌
SET PASSWORD = 'xxx';(旧语法,不触发校验) - ❌
GRANT ... TO 'u'@'%' IDENTIFIED BY 'xxx';(5.7 兼容写法,MySQL 8.0+ 已弃用且不校验) - ❌ 密码过期后首次登录重置(
mysql_secure_installation或客户端交互式重置)不走插件逻辑
最易踩坑的是用脚本批量建用户——如果脚本里混用了 GRANT ... IDENTIFIED BY,密码再弱也不会报错。
为什么 root 用户有时绕过校验?
root 用户本身不受 validate_password 约束,这是设计行为,不是 bug。MySQL 认为 root 是特权账户,应由管理员自行控制。
但如果你发现普通用户也绕过了校验,优先排查:
- 插件根本没启用(
SELECT PLUGIN_STATUS返回DISABLED) - 用户是通过
authentication_policy(MySQL 8.0.28+)或外部认证(如 PAM、LDAP)登录,此时密码由外部系统校验,MySQL 插件不介入 - SQL mode 中启用了
NO_AUTO_CREATE_USER或其他兼容模式,干扰了权限语句解析
插件只对本地存储密码生效,对 caching_sha2_password 插件生成的哈希值无感知——它校验的是明文密码字符串,不是哈希结果。











