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 8.4 將授予此類使用者的權限視為已授予 '
,但此行為已被棄用,因此在未來版本的 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 mysql_native_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 8.4 支援多因素驗證 (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
表中。如果外掛程式需要雜湊值,則該值必須已經以外掛程式適用的格式進行雜湊;否則,該值無法被外掛程式使用,並且不會發生用戶端連線的正確驗證。雜湊字串可以是字串常值或十六進位值。後者對應於當啟用
print_identified_with_as_hex
系統變數時,SHOW CREATE USER
針對包含無法列印字元的密碼雜湊所顯示的值類型。重要雖然我們顯示帶引號的
'
,但用於此目的的十六進位值不得加上引號。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 mysql_native_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 相關選項,請使用 REQUIRE
子句,其中指定一個或多個 tls_option
值。
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';
SUBJECT
、ISSUER
和 CIPHER
選項可以在 REQUIRE
子句中組合使用。
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
選項都必須是非零值。以下語句會建立一個在連續 4 次密碼失敗後保持鎖定兩天的帳戶
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 物件,透過將
ATTRIBUTE '
作為json_object
'CREATE USER
的一部分來設定。json_object
必須是有效的 JSON 物件。範例(省略任何其他選項)
CREATE USER 'jim'@'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';
使用者註解和使用者屬性一起儲存在資訊綱要 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
子句時產生的隨機密碼。