CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
DEFAULT ROLE role [, role ] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
[COMMENT 'comment_string' | ATTRIBUTE 'json_object']
user:
(see Section 8.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED BY RANDOM PASSWORD [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin [initial_auth_option]
}
2fa_auth_option: {
IDENTIFIED BY 'auth_string' [AND 3fa_auth_option]
| IDENTIFIED BY RANDOM PASSWORD [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 3fa_auth_option]
}
3fa_auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin AS 'auth_string'
}
initial_auth_option: {
INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'}
| INITIAL AUTHENTICATION IDENTIFIED WITH auth_plugin AS 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
password_option: {
PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
| PASSWORD HISTORY {DEFAULT | N}
| PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
| PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
| FAILED_LOGIN_ATTEMPTS N
| PASSWORD_LOCK_TIME {N | UNBOUNDED}
}
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
CREATE USER
陳述式會建立新的 MySQL 帳戶。它允許為新帳戶建立驗證、角色、SSL/TLS、資源限制、密碼管理、註解和屬性等屬性。它還能控制帳戶是否在初始狀態時處於鎖定或解除鎖定的狀態。
要使用 CREATE USER
,您必須擁有全域的 CREATE USER
權限,或對 mysql
系統綱要擁有 INSERT
權限。當啟用 read_only
系統變數時,CREATE USER
還需要 CONNECTION_ADMIN
權限(或已棄用的 SUPER
權限)。
這些額外的權限考量也適用
authentication_policy
系統變數對CREATE USER
陳述式的驗證相關子句的使用方式施加某些限制;有關詳細資訊,請參閱該變數的說明。如果您擁有AUTHENTICATION_POLICY_ADMIN
權限,這些限制不適用。要建立使用無密碼驗證的帳戶,您必須擁有
PASSWORDLESS_USER_ADMIN
權限。
如果任何要建立的帳戶被命名為任何儲存物件的 DEFINER
屬性,CREATE USER
將失敗並產生錯誤。(也就是說,如果建立帳戶會導致該帳戶採用目前為孤立的儲存物件,則陳述式會失敗。)要強制執行此操作,您必須擁有 SET_ANY_DEFINER
或 ALLOW_NONEXISTENT_DEFINER
權限;在這種情況下,陳述式會成功但會產生警告,而不是失敗並產生錯誤。若要在沒有這些權限的情況下執行使用者建立操作,請刪除孤立的物件、建立帳戶並授予其權限,然後重新建立已刪除的物件。如需其他資訊,包括如何識別哪些物件將給定帳戶命名為 DEFINER
屬性,請參閱 孤立儲存物件。
如果發生任何錯誤,CREATE USER
要麼對所有指定的用戶都成功,要麼回滾且無任何效果。預設情況下,如果您嘗試建立已存在的用戶,就會發生錯誤。如果給定 IF NOT EXISTS
子句,則陳述式會為每個已存在的指定使用者產生警告,而不是錯誤。
在某些情況下,CREATE USER
可能會記錄在伺服器日誌中或用戶端的歷程檔案中,例如 ~/.mysql_history
,這表示任何具有讀取該資訊權限的人都可以讀取明文密碼。有關伺服器日誌發生這種情況的條件以及如何控制它的資訊,請參閱 第 8.1.2.3 節,「密碼與記錄」。有關用戶端記錄的類似資訊,請參閱 第 6.5.1.3 節,「mysql 用戶端記錄」。
CREATE USER
陳述式有幾個方面,將在以下主題中說明
對於每個帳戶,CREATE USER
會在 mysql.user
系統資料表中建立一個新列。帳戶列反映陳述式中指定的屬性。未指定的屬性會設定為預設值
驗證:預設驗證外掛程式(如預設驗證外掛程式中所述決定)和空憑證
預設角色:
NONE
SSL/TLS:
NONE
資源限制:無限制
密碼管理:
PASSWORD EXPIRE DEFAULT PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
;停用登入失敗追蹤和暫時帳戶鎖定帳戶鎖定:
ACCOUNT UNLOCK
首次建立的帳戶沒有任何權限和預設角色 NONE
。要將權限或角色指派給此帳戶,請使用一個或多個 GRANT
陳述式。
每個帳戶名稱都使用第 8.2.4 節,「指定帳戶名稱」中描述的格式。例如
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如果省略帳戶名稱的主機名稱部分,則預設為 '%'
。您應該知道,雖然 MySQL 9.0 將授予此類使用者的權限視為已授予 '
,但此行為已棄用,因此可能會在未來版本的 MySQL 中移除。user
'@'localhost'
命名帳戶的每個 user
值後面可以跟隨一個可選的 auth_option
值,該值指示帳戶的驗證方式。這些值允許指定帳戶驗證外掛程式和憑證(例如,密碼)。每個 auth_option
值僅適用於緊接在其前面的命名帳戶。
在 user
規格之後,陳述式可以包含 SSL/TLS、資源限制、密碼管理和鎖定屬性的選項。所有此類選項對於陳述式而言都是全域的,並且適用於陳述式中指定的所有帳戶。
範例:建立使用預設驗證外掛程式和給定密碼的帳戶。將密碼標記為過期,以便使用者在首次連線到伺服器時必須選擇新密碼
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY 'new_password' PASSWORD EXPIRE;
範例:建立使用 caching_sha2_password
驗證外掛程式和給定密碼的帳戶。要求每 180 天選擇一個新密碼,並啟用失敗登入追蹤,以便連續三次錯誤密碼會導致帳戶暫時鎖定兩天
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'new_password'
PASSWORD EXPIRE INTERVAL 180 DAY
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
範例:建立多個帳戶,指定一些依帳戶屬性,以及一些全域屬性
CREATE USER
'jeffrey'@'localhost' IDENTIFIED WITH caching_sha2_password
BY 'new_password1',
'jeanne'@'localhost' IDENTIFIED WITH caching_sha2_password
BY 'new_password2'
REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
PASSWORD HISTORY 5
ACCOUNT LOCK;
每個 auth_option
值(在此範例中為 IDENTIFIED WITH ... BY
)僅適用於緊接在其前面的命名帳戶,因此每個帳戶都使用緊隨其後的驗證外掛程式和密碼。
其餘屬性全域適用於陳述式中指定的所有帳戶,因此對於兩個帳戶而言
連線必須使用有效的 X.509 憑證。
每小時最多允許 60 個查詢。
密碼變更不能重複使用最近五個密碼中的任何一個。
帳戶最初處於鎖定狀態,因此實際上它是一個佔位符,直到管理員解除鎖定才能使用。
帳戶名稱後面可以跟隨一個 auth_option
驗證選項,該選項指定帳戶驗證外掛程式、憑證或兩者皆指定。
MySQL 9.0 支援多因素驗證 (MFA),使得帳戶可以有多達三種驗證方法。也就是說,帳戶可以使用雙因素驗證 (2FA) 或三因素驗證 (3FA)。auth_option
的語法和語意保持不變,但 auth_option
後面可以跟隨額外驗證方法的規格。本節介紹 auth_option
。有關可選的 MFA 相關後續子句的詳細資訊,請參閱 CREATE USER 多因素驗證選項。
隨機密碼產生子句僅適用於使用將憑證內部儲存到 MySQL 的驗證外掛程式的帳戶。對於使用外掛程式對 MySQL 外部的憑證系統執行驗證的帳戶,密碼管理也必須在外部對該系統處理。有關內部憑證儲存的詳細資訊,請參閱 第 8.2.15 節,「密碼管理」。
auth_plugin
命名驗證外掛程式。外掛程式名稱可以是帶引號的字串文字或不帶引號的名稱。外掛程式名稱儲存在mysql.user
系統資料表的plugin
欄中。對於未指定驗證外掛程式的
auth_option
語法,伺服器會指派預設外掛程式,如預設驗證外掛程式中所述決定。有關每個外掛程式的說明,請參閱 第 8.4.1 節,「驗證外掛程式」。內部儲存的憑證會儲存在
mysql.user
系統表格中。'
值或auth_string
'RANDOM PASSWORD
分別指定帳戶憑證,可以是以純文字(未加密)字串或以與該帳戶相關聯的驗證外掛程式所預期的格式進行雜湊處理。對於使用
BY '
的語法,該字串是純文字,並傳遞給驗證外掛程式以進行可能的雜湊處理。外掛程式傳回的結果會儲存在auth_string
'mysql.user
表格中。外掛程式可能會使用指定的值,在這種情況下不會發生雜湊處理。對於使用
BY RANDOM PASSWORD
的語法,MySQL 會產生一個隨機密碼,並以純文字形式將其傳遞給驗證外掛程式以進行可能的雜湊處理。外掛程式傳回的結果會儲存在mysql.user
表格中。外掛程式可能會使用指定的值,在這種情況下不會發生雜湊處理。隨機產生的密碼具有隨機密碼產生中所述的特性。
對於使用
AS '
的語法,該字串會被假設為已經是驗證外掛程式所需的格式,並按原樣儲存在auth_string
'mysql.user
表格中。如果外掛程式需要雜湊值,則該值必須已經以適合該外掛程式的格式進行雜湊;否則,該值將無法被外掛程式使用,並且不會發生客戶端連線的正確驗證。雜湊字串可以是字串文字或十六進位值。後者對應於
SHOW CREATE USER
針對包含無法列印字元的密碼雜湊所顯示的值類型,當啟用print_identified_with_as_hex
系統變數時。重要雖然我們顯示帶引號的
'
,但用於此目的的十六進位值不得用引號括起來。auth_string
'如果驗證外掛程式不對驗證字串進行雜湊處理,則
BY '
和auth_string
'AS '
子句的效果相同:驗證字串會按原樣儲存在auth_string
'mysql.user
系統表格中。
CREATE USER
允許以下 auth_option
語法
IDENTIFIED BY '
auth_string
'將帳戶驗證外掛程式設定為預設外掛程式,將純文字
'
值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在auth_string
'mysql.user
系統表格中的帳戶列中。IDENTIFIED BY RANDOM PASSWORD
將帳戶驗證外掛程式設定為預設外掛程式,產生一個隨機密碼,將純文字密碼值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在
mysql.user
系統表格中的帳戶列中。該語句還會在結果集中傳回純文字密碼,以使其可供執行該語句的使用者或應用程式使用。有關結果集和隨機產生密碼特性的詳細資訊,請參閱隨機密碼產生。IDENTIFIED WITH
auth_plugin
將帳戶驗證外掛程式設定為
auth_plugin
,將憑證清除為空字串,並將結果儲存在mysql.user
系統表格中的帳戶列中。IDENTIFIED WITH
auth_plugin
BY 'auth_string
'將帳戶驗證外掛程式設定為
auth_plugin
,將純文字'
值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在auth_string
'mysql.user
系統表格中的帳戶列中。IDENTIFIED WITH
auth_plugin
BY RANDOM PASSWORD將帳戶驗證外掛程式設定為
auth_plugin
,產生一個隨機密碼,將純文字密碼值傳遞給外掛程式以進行可能的雜湊處理,並將結果儲存在mysql.user
系統表格中的帳戶列中。該語句還會在結果集中傳回純文字密碼,以使其可供執行該語句的使用者或應用程式使用。有關結果集和隨機產生密碼特性的詳細資訊,請參閱隨機密碼產生。IDENTIFIED WITH
auth_plugin
AS 'auth_string
'將帳戶驗證外掛程式設定為
auth_plugin
,並按原樣將'
值儲存在auth_string
'mysql.user
帳戶列中。如果外掛程式需要雜湊字串,則假設該字串已經以該外掛程式所需的格式進行雜湊。
範例:將密碼指定為純文字;使用預設外掛程式
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY 'password';
範例:指定驗證外掛程式,以及純文字密碼值
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';
在每種情況下,儲存在帳戶列中的密碼值都是純文字值 '
,在經過與該帳戶相關聯的驗證外掛程式雜湊之後。password
'
有關設定密碼和驗證外掛程式的其他資訊,請參閱第 8.2.14 節,「指派帳戶密碼」,以及第 8.2.17 節,「可外掛式驗證」。
CREATE USER
的 auth_option
部分定義了單因素驗證 (1FA/SFA) 的驗證方法。 CREATE USER
也支援多因素驗證 (MFA),因此帳戶最多可以有三種驗證方法。也就是說,帳戶可以使用雙因素驗證 (2FA) 或三因素驗證 (3FA)。
authentication_policy
系統變數定義了具有多因素驗證 (MFA) 子句的 CREATE USER
語句的約束。例如,authentication_policy
設定控制帳戶可能擁有的驗證因素數量,以及每個因素允許使用哪些驗證方法。請參閱設定多因素驗證原則。
有關決定未命名外掛程式的驗證子句的預設驗證外掛程式的因素特定規則的資訊,請參閱預設驗證外掛程式。
在 auth_option
之後,可能會出現不同的可選 MFA 子句
2fa_auth_option
:指定因素 2 驗證方法。以下範例定義caching_sha2_password
作為因素 1 驗證方法,並定義authentication_ldap_sasl
作為因素 2 驗證方法。CREATE USER 'u1'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'sha2_password' AND IDENTIFIED WITH authentication_ldap_sasl AS 'uid=u1_ldap,ou=People,dc=example,dc=com';
3fa_auth_option
:在2fa_auth_option
之後,可能會出現3fa_auth_option
子句,以指定因素 3 驗證方法。以下範例定義caching_sha2_password
作為因素 1 驗證方法,authentication_ldap_sasl
作為因素 2 驗證方法,以及authentication_webauthn
作為因素 3 驗證方法。CREATE USER 'u1'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'sha2_password' AND IDENTIFIED WITH authentication_ldap_sasl AS 'uid=u1_ldap,ou=People,dc=example,dc=com' AND IDENTIFIED WITH authentication_webauthn;
initial_auth_option
:指定用於設定 FIDO/FIDO2 無密碼驗證的初始驗證方法。如下所示,需要使用產生的隨機密碼或使用者指定的auth-string
進行臨時驗證,才能啟用 WebAuthn 無密碼驗證。CREATE USER user IDENTIFIED WITH authentication_webauthn INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};
有關使用 WebAuthn 可外掛式驗證設定無密碼驗證的資訊,請參閱WebAuthn 無密碼驗證。
DEFAULT ROLE
子句定義當使用者連線到伺服器並進行驗證,或當使用者在會話期間執行 SET ROLE DEFAULT
語句時,哪些角色會變為作用中。
每個角色名稱都使用第 8.2.5 節,「指定角色名稱」中所述的格式。例如
CREATE USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;
角色名稱的主機名稱部分(如果省略)預設為 '%'
。
DEFAULT ROLE
子句允許包含一個或多個逗號分隔的角色名稱列表。這些角色必須在執行 CREATE USER
時存在;否則該語句會引發錯誤 (ER_USER_DOES_NOT_EXIST
),且不會建立使用者。
MySQL 除了基於使用者名稱和憑證的常用驗證之外,還可以檢查 X.509 憑證屬性。有關在 MySQL 中使用 SSL/TLS 的背景資訊,請參閱第 8.3 節,「使用加密連線」。
若要為 MySQL 帳戶指定 SSL/TLS 相關選項,請使用指定一個或多個 tls_option
值的 REQUIRE
子句。
REQUIRE
選項的順序並不重要,但任何選項都不能指定兩次。REQUIRE
選項之間,AND
關鍵字是可選的。
CREATE USER
允許以下 tls_option
值
NONE
表示語句中指定的所有帳戶都不需要 SSL 或 X.509 要求。如果使用者名稱和密碼有效,則允許未加密的連線。如果用戶端具有適當的憑證和金鑰檔案,則可以選擇使用加密連線。
CREATE USER 'jeffrey'@'localhost' REQUIRE NONE;
用戶端預設會嘗試建立安全連線。對於具有
REQUIRE NONE
的用戶端,如果無法建立安全連線,連線嘗試會回退到未加密的連線。若要要求加密連線,用戶端只需要指定--ssl-mode=REQUIRED
選項;如果無法建立安全連線,連線嘗試將會失敗。如果未指定任何與 SSL 相關的
REQUIRE
選項,則預設值為NONE
。SSL
告知伺服器僅允許語句中指定的所有帳戶使用加密連線。
CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;
用戶端預設會嘗試建立安全連線。對於具有
REQUIRE SSL
的帳戶,如果無法建立安全連線,連線嘗試將會失敗。X509
對於語句中指定的所有帳戶,要求用戶端提供有效的憑證,但確切的憑證、發行者和主體並不重要。唯一的要求是應該可以使用其中一個 CA 憑證驗證其簽名。使用 X.509 憑證始終表示加密,因此在這種情況下,
SSL
選項是不必要的。CREATE USER 'jeffrey'@'localhost' REQUIRE X509;
對於具有
REQUIRE X509
的帳戶,用戶端必須指定--ssl-key
和--ssl-cert
選項才能連線。(建議但不要求也指定--ssl-ca
,以便可以驗證伺服器提供的公用憑證。)ISSUER
和SUBJECT
也是如此,因為這些REQUIRE
選項暗示了X509
的要求。ISSUER '
issuer
'對於語句中指定的所有帳戶,要求用戶端提供由 CA
'
發行的有效 X.509 憑證。如果用戶端提供的憑證有效但發行者不同,伺服器將拒絕連線。使用 X.509 憑證始終表示加密,因此在這種情況下,issuer
'SSL
選項是不必要的。CREATE USER 'jeffrey'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL/CN=CA/emailAddress=ca@example.com';
因為
ISSUER
暗示了X509
的要求,所以用戶端必須指定--ssl-key
和--ssl-cert
選項才能連線。(建議但不要求也指定--ssl-ca
,以便可以驗證伺服器提供的公用憑證。)SUBJECT '
subject
'對於語句中指定的所有帳戶,要求用戶端提供包含主體
subject
的有效 X.509 憑證。如果用戶端提供的憑證有效但主體不同,伺服器將拒絕連線。使用 X.509 憑證始終表示加密,因此在這種情況下,SSL
選項是不必要的。CREATE USER 'jeffrey'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL demo client certificate/ CN=client/emailAddress=client@example.com';
MySQL 對
'
值與憑證中的值進行簡單的字串比較,因此字母大小寫和元件順序必須與憑證中呈現的完全一致。subject
'因為
SUBJECT
暗示了X509
的要求,所以用戶端必須指定--ssl-key
和--ssl-cert
選項才能連線。(建議但不要求也指定--ssl-ca
,以便可以驗證伺服器提供的公用憑證。)CIPHER '
cipher
'對於語句中指定的所有帳戶,要求使用特定的加密方法來加密連線。需要此選項來確保使用足夠強度的密碼和金鑰長度。如果使用使用短加密金鑰的舊演算法,加密可能會很弱。
CREATE USER 'jeffrey'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
可以在 REQUIRE
子句中組合 SUBJECT
、ISSUER
和 CIPHER
選項。
CREATE USER 'jeffrey'@'localhost'
REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
O=MySQL demo client certificate/
CN=client/emailAddress=client@example.com'
AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
O=MySQL/CN=CA/emailAddress=ca@example.com'
AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
可以限制帳戶對伺服器資源的使用,如第 8.2.21 節「設定帳戶資源限制」中所述。若要執行此操作,請使用指定一個或多個 resource_option
值的 WITH
子句。
WITH
選項的順序無關緊要,但如果多次指定給定的資源限制,則最後一個實例優先。
CREATE USER
允許使用這些 resource_option
值
MAX_QUERIES_PER_HOUR
、count
MAX_UPDATES_PER_HOUR
、count
MAX_CONNECTIONS_PER_HOUR
count
對於語句中指定的所有帳戶,這些選項限制在任何給定的 1 小時期間內,每個帳戶允許對伺服器進行多少個查詢、更新和連線。如果
count
為0
(預設值),則表示該帳戶沒有限制。MAX_USER_CONNECTIONS
count
對於語句中指定的所有帳戶,限制每個帳戶對伺服器同時連線的最大數量。非零的
count
會明確指定帳戶的限制。如果count
為0
(預設值),伺服器會從max_user_connections
系統變數的全局值確定帳戶的同時連線數。如果max_user_connections
也為零,則該帳戶沒有限制。
範例
CREATE USER 'jeffrey'@'localhost'
WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
CREATE USER
支援多個用於密碼管理的 password_option
值
密碼過期選項:您可以手動使帳戶密碼過期,並建立其密碼過期原則。原則選項不會使密碼過期。相反地,它們會根據密碼的使用期限決定伺服器如何對帳戶應用自動過期,而密碼的使用期限是根據最近一次變更帳戶密碼的日期和時間來評估的。
密碼重複使用選項:您可以根據密碼變更次數、經過的時間或兩者來限制密碼的重複使用。
密碼驗證必要選項:您可以指出嘗試變更帳戶密碼是否必須指定目前的密碼,以驗證嘗試進行變更的使用者實際上知道目前的密碼。
錯誤密碼登入失敗追蹤選項:您可以使伺服器追蹤登入失敗的嘗試,並暫時鎖定提供過多連續錯誤密碼的帳戶。所需的失敗次數和鎖定時間是可設定的。
本節描述密碼管理選項的語法。如需關於建立密碼管理原則的資訊,請參閱第 8.2.15 節「密碼管理」。
如果指定了給定類型的多個密碼管理選項,則最後一個選項優先。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVER
與 PASSWORD EXPIRE NEVER
相同。
除了與登入失敗追蹤相關的選項外,密碼管理選項僅適用於使用將憑證儲存在 MySQL 內部的驗證外掛程式的帳戶。對於使用針對 MySQL 外部的憑證系統執行驗證的外掛程式的帳戶,密碼管理也必須在外部針對該系統進行處理。如需關於內部憑證儲存的詳細資訊,請參閱第 8.2.15 節「密碼管理」。
如果帳戶密碼是手動過期的,或者密碼的使用期限被認為大於自動過期原則所允許的生命週期,則用戶端的密碼已過期。在這種情況下,伺服器會中斷用戶端的連線,或限制允許用戶端執行的操作(請參閱第 8.2.16 節「伺服器處理過期密碼」)。受限制的用戶端執行的操作會導致錯誤,直到使用者建立新的帳戶密碼為止。
CREATE USER
允許使用這些 password_option
值來控制密碼過期
PASSWORD EXPIRE
立即將語句中指定的所有帳戶的密碼標記為過期。
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
PASSWORD EXPIRE DEFAULT
設定語句中指定的所有帳戶,使其套用全域過期原則,如
default_password_lifetime
系統變數所指定。CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
PASSWORD EXPIRE NEVER
此過期選項會覆蓋語句中指定的所有帳戶的全局原則。對於每個帳戶,它會停用密碼過期,以便密碼永遠不會過期。
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
PASSWORD EXPIRE INTERVAL
N
DAY此過期選項會覆蓋語句中指定的所有帳戶的全局原則。對於每個帳戶,它會將密碼的使用期限設定為
N
天。以下陳述式要求每 180 天變更密碼CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
CREATE USER
允許使用這些 password_option
值來控制根據要求的密碼變更最少次數重複使用先前的密碼
PASSWORD HISTORY DEFAULT
設定語句中指定的所有帳戶,使其套用關於密碼歷史記錄長度的全局原則,以禁止重複使用密碼,直到密碼變更次數達到
password_history
系統變數所指定的次數。CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
PASSWORD HISTORY
N
此歷史記錄長度選項會覆蓋語句中指定的所有帳戶的全局原則。對於每個帳戶,它會將密碼歷史記錄長度設定為
N
個密碼,以禁止重複使用最近選擇的N
個密碼中的任何一個。以下陳述式禁止重複使用先前 6 個密碼中的任何一個CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;
CREATE USER
允許使用這些 password_option
值,根據經過的時間來控制先前密碼的重複使用。
PASSWORD REUSE INTERVAL DEFAULT
設定帳戶中所有指定的陳述式,使其套用關於時間經過的全局策略,以禁止重複使用比系統變數
password_reuse_interval
所指定天數更新的密碼。CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
PASSWORD REUSE INTERVAL
N
DAY此時間經過選項會覆寫陳述式中所有帳戶的全局策略。對於每個帳戶,它會將密碼重複使用間隔設定為
N
天,以禁止重複使用比該天數更新的密碼。以下陳述式禁止在 360 天內重複使用密碼:CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;
CREATE USER
允許使用這些 password_option
值,來控制嘗試變更帳戶密碼時是否必須指定目前密碼,以驗證嘗試進行變更的使用者是否確實知道目前密碼。
PASSWORD REQUIRE CURRENT
此驗證選項會覆寫陳述式中所有帳戶的全局策略。對於每個帳戶,它會要求密碼變更必須指定目前密碼。
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
PASSWORD REQUIRE CURRENT OPTIONAL
此驗證選項會覆寫陳述式中所有帳戶的全局策略。對於每個帳戶,它不要求密碼變更必須指定目前密碼。(可以給出目前密碼,但並非必要。)
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
PASSWORD REQUIRE CURRENT DEFAULT
設定帳戶中所有指定的陳述式,使其套用關於密碼驗證的全局策略,如系統變數
password_require_current
所指定。CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
CREATE USER
允許使用這些 password_option
值,來控制失敗登入追蹤。
FAILED_LOGIN_ATTEMPTS
N
是否追蹤指定錯誤密碼的帳戶登入嘗試。
N
必須是 0 到 32767 的數字。值為 0 會停用失敗登入追蹤。大於 0 的值表示多少次連續密碼失敗會導致暫時帳戶鎖定(如果PASSWORD_LOCK_TIME
也非零)。PASSWORD_LOCK_TIME {
N
| UNBOUNDED}在太多連續登入嘗試提供錯誤密碼後,帳戶鎖定的時間長度。
N
必須是 0 到 32767 的數字,或UNBOUNDED
。值為 0 會停用暫時帳戶鎖定。大於 0 的值表示帳戶鎖定的天數長度。值為UNBOUNDED
會使帳戶鎖定持續時間無限期;一旦鎖定,帳戶將保持鎖定狀態,直到解除鎖定。有關解除鎖定發生的條件資訊,請參閱 失敗登入追蹤和暫時帳戶鎖定。
若要發生失敗登入追蹤和暫時鎖定,帳戶的 FAILED_LOGIN_ATTEMPTS
和 PASSWORD_LOCK_TIME
選項都必須非零。以下陳述式建立一個帳戶,該帳戶在連續四次密碼失敗後將保持鎖定兩天:
CREATE USER 'jeffrey'@'localhost'
FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
您也可以在建立使用者時包含可選的註解或屬性,如下所述:
使用者註解
若要設定使用者註解,請將
COMMENT '
新增至user_comment
'CREATE USER
陳述式,其中user_comment
是使用者註解的文字。範例(省略任何其他選項):
CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
使用者屬性
使用者屬性是由一個或多個鍵值對組成的 JSON 物件,並透過在
CREATE USER
中包含ATTRIBUTE '
來設定。json_object
'json_object
必須是有效的 JSON 物件。範例(省略任何其他選項):
CREATE USER 'jim'@'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';
使用者註解和使用者屬性會一起儲存在 Information Schema USER_ATTRIBUTES
表格的 ATTRIBUTE
欄中。此查詢顯示此表格中由剛剛顯示的建立使用者 jim@localhost
的陳述式插入的列:
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
-> WHERE USER = 'jim' AND HOST = 'localhost'\G
*************************** 1. row ***************************
USER: jim
HOST: localhost
ATTRIBUTE: {"fname": "James", "lname": "Scott", "phone": "123-456-7890"}
1 row in set (0.00 sec)
COMMENT
選項實際上提供了一個快捷方式,用於設定使用者屬性,該屬性的唯一元素以 comment
作為其鍵,並且其值是為該選項提供的引數。您可以透過執行陳述式 CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon'
並觀察它插入到 USER_ATTRIBUTES
表格的列來看到這一點。
mysql> CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
-> WHERE USER = 'jon' AND HOST = 'localhost';
+------+-----------+-------------------------------------------+
| USER | HOST | ATTRIBUTE |
+------+-----------+-------------------------------------------+
| jon | localhost | {"comment": "Some information about Jon"} |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec)
您無法在同一個 CREATE USER
陳述式中同時使用 COMMENT
和 ATTRIBUTE
;嘗試這樣做會導致語法錯誤。若要同時設定使用者註解和使用者屬性,請使用 ATTRIBUTE
并在其引數中包含具有 comment
鍵的值,如下所示:
mysql> CREATE USER 'bill'@'localhost'
-> ATTRIBUTE '{"fname":"William", "lname":"Schmidt",
-> "comment":"Website developer"}';
Query OK, 0 rows affected (0.16 sec)
由於 ATTRIBUTE
列的內容是 JSON 物件,因此您可以使用任何適當的 MySQL JSON 函式或運算符來操作它,如下所示:
mysql> SELECT
-> USER AS User,
-> HOST AS Host,
-> CONCAT(ATTRIBUTE->>"$.fname"," ",ATTRIBUTE->>"$.lname") AS 'Full Name',
-> ATTRIBUTE->>"$.comment" AS Comment
-> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
-> WHERE USER='bill' AND HOST='localhost';
+------+-----------+-----------------+-------------------+
| User | Host | Full Name | Comment |
+------+-----------+-----------------+-------------------+
| bill | localhost | William Schmidt | Website developer |
+------+-----------+-----------------+-------------------+
1 row in set (0.00 sec)
若要設定或變更現有使用者的使用者註解或使用者屬性,您可以使用 ALTER USER
陳述式的 COMMENT
或 ATTRIBUTE
選項。
由於使用者註解和使用者屬性在內部一起儲存在單個 JSON
欄中,因此這會設定其最大組合大小的上限;有關更多資訊,請參閱 JSON 儲存要求。
另請參閱 Information Schema USER_ATTRIBUTES
表格的描述,以取得更多資訊和範例。
MySQL 支援使用 ACCOUNT LOCK
和 ACCOUNT UNLOCK
選項來鎖定和解除鎖定帳戶,這些選項指定帳戶的鎖定狀態。有關其他討論,請參閱第 8.2.20 節,〈帳戶鎖定〉。
如果指定了多個帳戶鎖定選項,則最後一個選項優先。
如果 CREATE USER
成功,則會寫入二進位日誌,但如果失敗則不會;在這種情況下,會發生回滾且不會進行任何變更。寫入二進位日誌的陳述式包含所有指定的使用者。如果給定 IF NOT EXISTS
子句,則即使包含已經存在且未建立的使用者。
寫入二進位日誌的陳述式會為每個使用者指定一個身份驗證外掛程式,決定方式如下:
如果指定了,則為原始陳述式中命名的外掛程式。
否則,為預設身份驗證外掛程式。特別是,如果使用者
u1
已經存在並使用非預設身份驗證外掛程式,則為CREATE USER IF NOT EXISTS u1
寫入二進位日誌的陳述式會命名預設身份驗證外掛程式。(如果寫入二進位日誌的陳述式必須為使用者指定非預設身份驗證外掛程式,請將其包含在原始陳述式中。)
如果伺服器在寫入二進位日誌的陳述式中為任何不存在的使用者新增預設身份驗證外掛程式,則會將警告寫入錯誤日誌,並命名這些使用者。
如果原始陳述式指定了 FAILED_LOGIN_ATTEMPTS
或 PASSWORD_LOCK_TIME
選項,則寫入二進位日誌的陳述式會包含該選項。
具有支援多重要素驗證 (MFA) 子句的 CREATE USER
陳述式會寫入二進位日誌。
CREATE USER ... IDENTIFIED WITH .. INITIAL AUTHENTICATION IDENTIFIED WITH ...
陳述式會以CREATE USER .. IDENTIFIED WITH .. INITIAL AUTHENTICATION IDENTIFIED WITH .. AS '
的形式寫入二進位日誌,其中password-hash
'password-hash
是使用者指定的auth-string
或指定RANDOM PASSWORD
子句時伺服器產生的隨機密碼。