Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Server Handling of Expired Passwords

8.2.16 密码过期的服务器处理

MySQL 提供了密码过期能力,允许数据库管理员要求用户重置密码。密码可以手动过期,也可以根据策略自动过期(见第8.2.15节,“密码管理”)。

ALTER USER 语句启用账户密码过期。例如:

ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;

每个使用过期密码的连接,服务器将客户端断开或限制客户端到“sandbox 模式,”在该模式下,服务器允许客户端只执行重置过期密码所需操作。服务器采取哪种行动取决于客户端和服务器设置,后面会讨论。

如果服务器断开客户端,它返回一个ER_MUST_CHANGE_PASSWORD_LOGIN 错误:

$> mysql -u myuser -p
Password: ******
ERROR 1862 (HY000): Your password has expired. To log in you must
change it using a client that supports expired passwords.

如果服务器限制客户端到 sandbox 模式,这些操作在客户端会话中被允许:

  • 客户端可以使用ALTER USERSET PASSWORD 重置账户密码。重置后,服务器恢复正常访问权限,并且对后续使用该账户的连接也恢复。

    Note

    虽然可以将过期的密码重置为当前值,但是出于安全政策考虑,建议选择不同的密码。DBA 可以通过建立合适的密码重用策略来强制不重复使用。见密码重用策略

对于会话中不允许的操作,服务器返回一个ER_MUST_CHANGE_PASSWORD错误:

mysql> USE performance_schema;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

这通常在交互式调用mysql 客户端时发生,因为默认情况下这些调用是被置于沙箱模式中。要恢复正常的工作,选择新的密码。

对于非交互式调用mysql 客户端(例如,批处理模式),服务器通常会断开连接,因为密码过期。要允许非交互式mysql 调用保持连接以便更改密码(使用沙箱模式允许的语句),添加--connect-expired-password 选项到mysql 命令。

如前所述,服务器是否断开过期密码客户端或限制其到沙盒模式取决于客户端和服务器设置的组合。以下讨论描述了相关设置及其交互。

Note

这只适用于过期密码账户。如果客户端使用非过期密码连接,服务器正常处理客户端。

在客户端侧,给定的客户端指示是否可以处理过期密码。对于使用C客户库的客户端,有两种方式:

  • MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS 将其传递给mysql_options() 之前连接:

    bool arg = 1;
    mysql_options(mysql,
                  MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
                  &arg);

    这是mysql客户端内部使用的方法,如果交互式或使用--connect-expired-password选项启用MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS

  • CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS 将其传递给mysql_real_connect() 连接时:

    MYSQL mysql;
    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql,
                            host, user, password, db,
                            port, unix_socket,
                            CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS))
    {
      ... handle error ...
    }

其他MySQL连接器有自己的约定来指示是否可以处理沙盒模式。请查看您感兴趣的Connector文档。

在服务器侧,如果客户端指示可以处理过期密码,服务器将其置于沙盒模式。

如果客户端没有指示它可以处理过期密码(或使用更老版本的客户端库无法这样指示),服务器行为取决于disconnect_on_expired_password系统变量的值: