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 USER
或SET 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 调用保持连接以便更改密码(使用沙盒模式下允许的语句),请将 --connect-expired-password
选项添加到 mysql 命令中。
如前所述,服务器是断开过期密码客户端连接还是将其限制为沙盒模式取决于客户端和服务器设置的组合。以下讨论描述了相关设置以及它们之间的交互方式。
此讨论仅适用于过期密码的帐户。如果客户端使用非过期密码连接,服务器将正常处理客户端。
在客户端方面,给定客户端指示其是否可以处理过期密码的沙盒模式。对于使用 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
系统变量的值。
如果
disconnect_on_expired_password
启用(默认值),则服务器会使用ER_MUST_CHANGE_PASSWORD_LOGIN
错误断开客户端连接。如果
disconnect_on_expired_password
被禁用,则服务器会将客户端置于沙箱模式。