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
,伺服器會將客戶端置於沙盒模式。