文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  伺服器處理過期密碼

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 系統變數的值