文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  服务器处理过期密码

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 重置帐户密码。完成后,服务器会恢复会话的正常访问权限,以及后续使用该帐户的连接的正常访问权限。

    注意

    虽然可以通过将过期密码设置为其当前值来“重置”过期密码,但出于安全策略的考虑,最好选择一个不同的密码。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 调用保持连接,以便更改密码(使用沙箱模式下允许的语句),请在 mysql 命令中添加 --connect-expired-password 选项。

如前所述,服务器是断开过期密码客户端连接还是将其限制为沙箱模式,取决于客户端和服务器设置的组合。以下讨论描述了相关的设置以及它们是如何交互的。

注意

本讨论仅适用于密码过期的帐户。如果客户端使用未过期的密码连接,服务器会正常处理客户端。

在客户端方面,给定客户端会指示它是否可以处理过期密码的沙箱模式。对于使用 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 连接器有自己的约定来指示是否已准备好处理沙箱模式。请参阅您感兴趣的连接器的文档。

在服务器端,如果客户端指示它可以处理已过期的密码,服务器将把它置于沙箱模式。

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