Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

8.2.16 服务器处理过期密码

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

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

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

对于使用过期密码的每个连接,服务器要么断开客户端连接,要么将客户端限制在“沙盒模式”,在该模式下,服务器仅允许客户端执行必要的操作以重置过期密码。服务器采取的操作取决于客户端和服务器设置,如后面讨论。

如果服务器断开客户端连接,它将返回 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.

如果服务器将客户端限制在沙盒模式中,则允许客户端在会话中执行以下操作:

  • 客户端可以使用 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 客户端中使用的技术,启用 MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS 如果交互式调用或使用 --connect-expired-password 选项。

  • 在连接时将 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 连接器都有其自己的约定来指示sandbox模式的就绪性。请参阅您感兴趣的连接器的文档。

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

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