密码策略不是“限制用户改密码”,而是强制新密码合规
MySQL 本身不提供「禁止某用户修改自己密码」的权限开关,
ALTER USER ... IDENTIFIED BY是用户级操作,只要用户有
CREATE USER或
UPDATE权限(或更高),就能执行。真正起作用的是
validate_password插件——它在你设新密码时校验强度,不达标就直接报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。所以所谓“限制”,其实是用策略把弱密码挡在门外。 策略只在校验阶段生效:创建用户、
ALTER USER、
SET PASSWORD都会触发 它不管你是 root 还是普通用户,也不区分本地/远程连接,一视同仁 策略对已存在的弱密码无效——只管“改”和“新建”,不追溯旧账 若用户绕过策略(比如用哈希值直写
authentication_string),必须先
UNINSTALL PLUGIN validate_password,否则 UPDATE 会被拒绝
快速启用并调低策略(开发/测试环境常用)
很多新手卡在刚装完 MySQL 8.0 就连不上,就是因为默认
validate_password_policy = MEDIUM拒绝了简单密码。临时救急可这样操作: 确认插件是否加载:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';若未启用,安装:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';立即降低要求(重启后失效):
SET GLOBAL validate_password_policy = LOW;和
SET GLOBAL validate_password_length = 6;再执行密码修改:
ALTER USER 'test'@'localhost' IDENTIFIED BY '123456';
⚠️ 注意:
LOW策略只检查长度,不校验大小写/数字/特殊字符;但即使设成
LOW,
validate_password_length默认仍是 8,所以必须显式设为 6 才能用 6 位密码。
让策略永久生效:必须写进配置文件
SET GLOBAL修改只在当前实例生命周期内有效,MySQL 重启后还原。生产环境务必写入
my.cnf(Linux)或
my.ini(Windows)的
[mysqld]段:
[mysqld] validate_password_policy=STRONG validate_password_length=12 validate_password_mixed_case_count=2 validate_password_number_count=2 validate_password_special_char_count=2 validate_password_check_user_name=ON
✅ 这样重启后仍生效;❌ 不要漏掉
validate_password_check_user_name=ON,否则用户
'admin'设密码
'admin123!'也能通过——因为策略默认不检查用户名相似性。
想彻底禁用?可以,但别长期开着
某些老旧系统集成脚本硬编码了弱密码,实在无法改代码时,可临时卸载插件:
禁用:UNINSTALL PLUGIN validate_password;此时
ALTER USER 'xxx'@'%' IDENTIFIED BY '123'就能成功 用完立刻恢复:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
⚠️ 生产环境长期关闭等于裸奔:没有策略时,
root被设成
'password'或空密码都无人拦截。更危险的是,一旦卸载插件,所有依赖它的参数(如
validate_password_length)将从
SHOW VARIABLES中消失,后续
SET GLOBAL会报错 Unknown system variable —— 很容易让人误以为“策略还在但没生效”。
