6.2.12 服务器处理过期的密码

MySQL 提供了密码过期功能,该功能使数据库 Management 员可以要求用户重置密码。密码可以根据自动失效策略手动失效(请参阅第 6.2.11 节“密码 Management”)。

ALTER USER语句启用帐户密码到期。例如:

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

对于每个使用具有过期密码的帐户的连接,服务器都将断开 Client 端连接或将 Client 端限制为“沙盒模式”,在这种情况下,服务器仅允许 Client 端执行重置过期密码所需的那些操作。服务器采取哪种操作取决于 Client 端和服务器设置,这将在后面讨论。

如果服务器断开 Client 端的连接,则返回ER_MUST_CHANGE_PASSWORD_LOGIN错误:

shell> 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.

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

  • Client 端可以使用ALTER USERSET PASSWORD重置帐户密码。完成此操作后,服务器将恢复会话以及使用该帐户的后续连接的正常访问。

Note

尽管可以通过将过期的密码设置为当前值来“重置”它,但出于良好的 Policy 考虑,最好选择其他密码。

  • Client 端可以使用SET语句,该语句在 MySQL 5.7.6 之前很有用,如果必须使用SET PASSWORD而不是ALTER USER并且该帐户使用身份验证插件,则必须先将old_passwords系统变量设置为非默认值才能在其中执行密码哈希一种特定的方式。

对于会话中不允许的任何操作,服务器将返回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.

mysqlClient 端的交互式调用通常会发生这种情况,因为默认情况下,此类调用处于沙盒模式。要恢复正常运行,请选择一个新密码。

对于mysqlClient 端的非交互式调用(例如,以批处理方式),如果密码过期,则服务器通常会断开与 Client 端的连接。要允许非交互式mysql调用保持连接状态,以便可以更改密码(使用沙箱模式中允许的语句),请在mysql命令中添加--connect-expired-password选项。

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

Note

此讨论仅适用于密码过期的帐户。如果 Client 端使用未过期的密码进行连接,则服务器将正常处理该 Client 端。

在 Client 端,给定的 Client 端指示它是否可以处理过期密码的沙箱模式。对于使用 CClient 端库的 Client 端,有两种方法可以执行此操作:

  • 在连接之前,将MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS标志传递给mysql_options()
my_bool arg = 1;
mysql_options(mysql,
              MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
              &arg);

这是mysqlClient 端中使用的技术,如果以交互方式或使用--connect-expired-password选项调用,则启用MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS

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 连接器具有自己的约定,这些约定指示准备处理沙箱模式。请参阅您感兴趣的连接器的文档。

在服务器端,如果 Client 端指示它可以处理过期的密码,则服务器会将其置于沙盒模式。

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