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
属性),请参阅 Orphan Stored Objects。
对于所有命名的用户,CREATE USER
都会成功,或者如果出现任何错误,则会回滚并且没有效果。默认情况下,如果您尝试创建已存在的用户,则会发生错误。如果给出了 IF NOT EXISTS
子句,则该语句会针对每个已存在的命名用户生成警告,而不是错误。
在某些情况下,CREATE USER
可能会记录在服务器日志中,或者在客户端的 history 文件(例如 ~/.mysql_history
)中记录,这意味着任何具有对该信息读取权限的人都可以读取明文密码。有关此情况在服务器日志中发生的条件以及如何控制它的信息,请参阅 Section 8.1.2.3, “Passwords and Logging”。有关客户端日志记录的类似信息,请参阅 Section 6.5.1.3, “mysql Client Logging”。
以下主题描述了 CREATE USER
语句的几个方面。
对于每个帐户,CREATE USER
在 mysql.user
系统表中创建一个新行。帐户行反映了语句中指定的属性。未指定的属性将设置为其默认值
身份验证:默认身份验证插件(如 The Default Authentication Plugin 中所述确定),以及空凭据
默认角色:
NONE
SSL/TLS:
NONE
资源限制:无限制
密码管理:
PASSWORD EXPIRE DEFAULT PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
;失败登录跟踪和临时帐户锁定已禁用帐户锁定:
ACCOUNT UNLOCK
首次创建的帐户没有权限,并且默认角色为 NONE
。要将权限或角色分配给此帐户,请使用一个或多个 GRANT
语句。
每个帐户名称都使用 Section 8.2.4, “Specifying Account Names” 中描述的格式。例如
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如果省略帐户名称的主机名部分,则默认值为 '%'
。您应该意识到,虽然 MySQL 9.0 将对 such 用户授予的权限视为已授予 '
,但此行为已弃用,因此可能会在 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 外部的凭据系统的插件的帐户,密码管理也必须在该系统外部进行处理。有关内部凭据存储的更多信息,请参阅 Section 8.2.15, “Password Management”。
auth_plugin
指定身份验证插件的名称。插件名称可以是带引号的字符串字面量或不带引号的名称。插件名称存储在mysql.user
系统表的plugin
列中。对于未指定身份验证插件的
auth_option
语法,服务器将分配默认插件,如 The Default Authentication Plugin 中所述确定。有关每个插件的描述,请参阅 Section 8.4.1, “Authentication Plugins”。在内部存储的凭据将存储在
mysql.user
系统表中。一个'
值或auth_string
'RANDOM PASSWORD
指定帐户凭据,可以是明文(未加密)字符串,也可以是与帐户关联的身份验证插件期望的格式进行哈希处理的字符串对于使用
BY '
的语法,该字符串是明文,并且会传递给身份验证插件以进行可能的哈希处理。插件返回的结果将存储在auth_string
'mysql.user
表中。插件可以使用指定的 value,在这种情况下不会进行哈希处理。对于使用
BY RANDOM PASSWORD
的语法,MySQL 将生成一个随机密码,并以明文形式传递给身份验证插件以进行可能的哈希处理。插件返回的结果将存储在mysql.user
表中。插件可以使用指定的 value,在这种情况下不会进行哈希处理。随机生成的密码具有 Random Password Generation 中描述的特征。
对于使用
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
系统表中的帐户行中。该语句还在结果集中返回明文密码,以使其可供执行该语句的用户或应用程序使用。有关结果集和随机生成密码的特征的详细信息,请参阅 Random Password Generation。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 相关的选项,请使用一个 REQUIRE
子句,该子句指定一个或多个 tls_option
值。
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 节“设置帐户资源限制” 中所述。为此,请使用一个 WITH
子句,该子句指定一个或多个 resource_option
值。
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 对象,可以通过包含
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 存储要求。
有关更多信息和示例,请参见信息架构 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
选项,则写入二进制日志的语句将包含该选项。
CREATE USER
包含支持多因素身份验证 (MFA) 的子句的语句将写入二进制日志。
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
子句时生成的随机密码。