文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (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 調用保持連線,以便可以變更密碼(使用沙箱模式中允許的陳述式),請將 --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 系統變數的值。