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 无密码身份验证的初始身份验证方法。如下所示,要启用 WebAuthn 无密码身份验证,需要使用生成的随机密码或用户指定的auth-string
进行临时身份验证。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
选项的顺序无关紧要,但不能两次指定同一个选项。AND
关键字在 REQUIRE
选项之间是可选的。
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/[email protected]';
因为
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/[email protected]';
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/[email protected]'
AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
O=MySQL/CN=CA/[email protected]'
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
对于语句中命名的所有帐户,这些选项限制了在任何给定的一小时内,每个帐户允许对服务器进行的查询、更新和连接的数量。如果
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"}';
用户注释和用户属性一起存储在信息架构 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 '关于 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)
要设置或更改现有用户的用户注释或用户属性,可以使用带有 COMMENT
或 ATTRIBUTE
选项的 ALTER USER
语句。
因为用户注释和用户属性在内部存储在一个 JSON
列中,所以这为它们的组合最大大小设置了一个上限;有关详细信息,请参阅 JSON 存储要求。
有关更多信息和示例,另请参阅信息架构 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
子句时生成的随机密码。