一聚教程网:一个值得你收藏的教程网站

热门教程

MySQL 8.4如何配置密码验证组件

时间:2026-08-31 08:39:47 编辑:袖梨 来源:一聚教程网

MySQL 8.4 默认不激活 validate_password,需先 INSTALL PLUGIN 加载,再用 SET PERSIST 持久化配置 length、policy 等参数,否则重启失效;策略仅对新建/修改密码生效,且变量名全小写、区分大小写。

MySQL 8.4 默认已启用 validate_password,但需手动配置策略参数

MySQL 8.4 仍内置 validate_password 插件(非默认激活),但安装后不会自动加载,也不带预设强度规则。你看到的“密码太弱”报错,往往是因为插件已加载但参数仍为默认宽松值(比如 validate_password.length = 8,validate_password.policy = MEDIUM),而新用户习惯性用简单密码,触发拦截。

实操要点:

  1. 先确认插件状态:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password'; —— 若返回 DISABLED 或空行,需先安装
  2. 安装命令(仅需一次):INSTALL PLUGIN validate_password SONAME 'validate_password.so';
  3. 插件加载后,参数全部通过系统变量控制,**不写入 my.cnf 的 [mysqld] 段落也能生效**,但重启后会丢失 —— 所以必须持久化

设置密码策略必须用 SET PERSIST,不能只用 SET GLOBAL

SET GLOBAL 只影响当前实例生命周期,MySQL 8.4 强烈推荐用 SET PERSIST 将变量写入 mysqld-auto.cnf(位于数据目录下),否则服务重启后策略失效,容易引发线上密码变更失败。

常用策略参数示例(执行前确保插件已安装):

SET PERSIST validate_password.length = 12;SET PERSIST validate_password.policy = STRONG;SET PERSIST validate_password.mixed_case_count = 2;SET PERSIST validate_password.number_count = 2;SET PERSIST validate_password.special_char_count = 2;

注意:policy = STRONG 会强制启用所有子规则(大小写、数字、特殊字符),但 validate_password.dictionary_file 默认为空,不校验字典词 —— 如需禁用常见弱口令,得手动指定词库路径并加载

STRONG 策略下 ALTER USER 报错 “Failed password validation” 怎么查原因

错误信息本身不提示具体哪条规则没满足,得反向比对当前策略参数和你输入的密码:

  1. SHOW VARIABLES LIKE 'validate_password%'; 查所有生效值
  2. 逐条验证:密码长度 ≥ validate_password.length?含至少 validate_password.mixed_case_count 个大写字母?小写字母数是否单独计数?(是的,mixed_case_count 指大小写总出现次数,不是“大小写各几个”)
  3. 特殊字符指 ASCII 33–47、58–64、91–96、123–126 范围内的字符(如 !, @, #, $),空格、中文、emoji 不算
  4. 若用 CREATE USERSET PASSWORD,同样受校验;但 GRANT ... IDENTIFIED BY 在 8.4 中已被弃用,会直接报错

升级到 8.4 后旧账号密码被拒绝,不是 bug 是策略继承问题

MySQL 升级本身不重置密码策略,但如果你在旧版本没装过 validate_password,升级后首次运行 INSTALL PLUGIN,所有变量会按 8.4 默认值初始化(比如 policy = MEDIUM),而旧账号密码可能只满足 LOW 级别要求 —— 这时改密操作就会失败。

临时绕过方法(仅限紧急修复):

  1. 用具有 SYSTEM_USER 权限的账号执行:SET SESSION validate_password.policy = LOW;,再改密
  2. 或临时卸载插件:UNINSTALL PLUGIN validate_password;(不推荐长期使用)
  3. 真正安全的做法是:升级前导出 SHOW VARIABLES LIKE 'validate_password%' 结果,升级后用 SET PERSIST 恢复原有策略

插件变量名区分大小写,validate_password.Policy 无效,必须全小写;另外 validate_password.check_user_name 默认开启,意味着密码不能包含用户名(哪怕子串),这点常被忽略。

热门栏目