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