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
属性相同,则该语句将失败。(也就是说,该语句将失败,因为创建账户将导致账户采用当前孤立的存储对象。)要执行该操作,必须具有 SET_USER_ID
权限;在这种情况下,该语句将以警告形式成功,而不是以错误形式失败。没有 SET_USER_ID
权限,要执行用户创建操作,需要删除孤立对象,创建账户并授予权限,然后重新创建删除的对象。有关更多信息,包括如何标识哪些对象将给定账户命名为 DEFINER
属性,请参阅 孤立存储对象。
创建用户
要么成功创建所有命名用户,要么回滚并且不产生任何效果,如果发生任何错误。默认情况下,如果尝试创建已经存在的用户,将发生错误。如果给定 IF NOT EXISTS
子句,该语句将为每个已经存在的命名用户生成警告,而不是错误。
在某些情况下, 创建用户
可能会记录在服务器日志或客户端的历史文件中,例如 ~/.mysql_history
,这意味着明文密码可能被拥有读取该信息权限的人读取。有关这些情况的信息,以及如何控制服务器日志,请参阅 第 8.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅 第 6.5.1.3 节,“mysql 客户端日志记录”。
创建用户
语句有几个方面,以下是相关主题:
对于每个账户,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.3 将授予该用户的权限视为授予了 '
,但这种行为自 MySQL 8.2.0 起已弃用,因此可能在未来版本的 MySQL 中删除。user
'@'localhost'
每个 用户
值命名的账户可以跟随一个可选的 auth_option
值,该值指示账户如何进行身份验证。这些值启用账户身份验证插件和凭据(例如,密码)以便指定。每个 auth_option
值仅应用于紧接着它的账户名称。
在 用户
规格之后,该语句可能包括 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.3 支持多因素身份验证(MFA),因此帐户可以拥有多达三个身份验证方法。也就是说,帐户可以使用双因素身份验证(2FA)或三因素身份验证(3FA)。语法和语义 auth_option
保持不变,但 auth_option
可以跟随其他身份验证方法的规格。此节描述 auth_option
。有关可选的 MFA 相关后续子句的详细信息,请参阅 CREATE USER 多因素身份验证选项。
随机密码生成子句仅适用于使用 MySQL 内部存储凭证的帐户。对于使用外部凭证系统的帐户,密码管理必须在该系统中外部处理。有关内部凭证存储的更多信息,请参阅 第 8.2.15 节,“密码管理”。
-
auth_plugin
指定身份验证插件。插件名称可以是带引号的字符串文字或未带引号的名称。插件名称存储在plugin
列的mysql.user
系统表中。对于不指定身份验证插件的
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
系统变量启用时,为包含不可打印字符的密码哈希值所显示的类型。 -
如果身份验证插件不对身份验证字符串进行哈希处理,则
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
系统表中的账户行中。 -
使用
auth_plugin
身份验证,密码为 'auth_string
'将账户身份验证插件设置为
auth_plugin
,将明文 'auth_string
' 传递给插件以进行可能的哈希处理,并将结果存储在mysql.user
系统表中的账户行中。 -
使用
auth_plugin
身份验证,随机密码将账户身份验证插件设置为
auth_plugin
,生成随机密码,将明文密码值传递给插件以进行可能的哈希处理,并将结果存储在mysql.user
系统表中的账户行中。该语句还将明文密码返回到结果集中,以便用户或执行语句的应用程序可以访问。有关随机生成密码的结果集和特征的详细信息,请参阅 随机密码生成。 -
使用
auth_plugin
身份验证,密码为 '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 节,“可插拔身份验证”。
该 auth_option
部分定义了一种身份验证方法,用于单因素/一因素身份验证 (1FA/SFA)。CREATE USER
也支持多因素身份验证 (MFA),这样账户可以拥有多达三个身份验证方法。也就是说,账户可以使用双因素身份验证 (2FA) 或三因素身份验证 (3FA)。
系统变量 authentication_policy
定义了 CREATE USER
语句中多因素身份验证 (MFA) 子句的约束。例如,authentication_policy
设置控制了账户可以拥有的身份验证因素数量,以及每个因素允许的身份验证方法。请参阅 配置多因素身份验证策略。
有关因素特定规则的信息,请参阅 默认身份验证插件,这些规则确定了身份验证子句中未命名插件的默认身份验证插件。
在 auth_option
之后,可能出现不同的可选 MFA 子句:
-
2fa_auth_option
:指定第二个身份验证方法。以下示例将caching_sha2_password
作为第一因素身份验证方法,并将authentication_ldap_sasl
作为第二因素身份验证方法。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
子句,以指定第三个身份验证方法。以下示例将caching_sha2_password
作为第一因素身份验证方法,authentication_ldap_sasl
作为第二因素身份验证方法,并将authentication_webauthn
作为第三因素身份验证方法。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
选项;如果无法建立安全连接,连接尝试将失败。NONE
是默认值,如果没有指定 SSL 相关的REQUIRE
选项。 -
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
'对于所有账户名称的语句,要求客户端提供有效的 X.509 证书,该证书由 CA
'
颁发。如果客户端提供的证书有效但颁发者不同,服务器将拒绝连接。使用 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 '
主题
'对于语句命名的所有账户,要求客户端呈现一个有效的 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
隐含了X509
的要求,客户端必须指定--ssl-key
和--ssl-cert
选项以连接。(建议但不需要指定--ssl-ca
,以便验证服务器提供的公共证书。) -
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 节,“设置账户资源限制” 中所讨论的那样。为此,请使用带有一个或多个 资源选项
值的 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
是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
。
除了与失败登录跟踪相关的选项外,密码管理选项仅适用于使用内部存储凭证的身份验证插件的账户。对于使用外部凭证系统的身份验证插件的账户,密码管理必须在该系统中外部处理。有关内部凭证存储的更多信息,请参阅第 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"}';
用户注释和用户属性一起存储在信息模式 ATTRIBUTE
列的 USER_ATTRIBUTES
表中。该查询显示了创建用户 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
已经存在并使用非默认身份验证插件,则写入二进制日志的语句将命名默认身份验证插件。(如果写入二进制日志的语句必须为用户指定非默认身份验证插件,请在原始语句中包括它。)
如果服务器为二进制日志中的任何不存在的用户添加默认身份验证插件,将在错误日志中写入警告,命名这些用户。
如果原始语句指定了 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
子句时。