15.7.1.3 创建用户语句
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
特权,或者 INSERT
特权对 mysql
系统架构。启用了 read_only
系统变量时,CREATE USER
还需要 CONNECTION_ADMIN
特权(或弃用的 SUPER
特权).
这些额外特权考虑也适用:
-
系统变量
authentication_policy
对CREATE USER
语句中的身份验证子句施加一定的限制;详细信息请查看该变量的描述。这些限制不适用于拥有AUTHENTICATION_POLICY_ADMIN
特权的用户。 -
创建无密码身份验证账户,您必须拥有
PASSWORDLESS_USER_ADMIN
特权。
CREATE USER
如果要创建的帐户与某个存储对象的 DEFINER
属性相同,会出错。要执行该操作,可以拥有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 内部存储凭证的账户。对于使用外部凭证系统的插件,密码管理必须在该系统外部处理。关于内部凭证存储的更多信息,请参见第 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
系统变量启用时。Important虽然我们显示
'
使用引号,但用于这个目的的十六进制值不需要引号。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 多因素认证 Options
auth_option
部分CREATE USER
定义了一种单因素认证方法(一因素认证)。同时CREATE USER
也支持多因素认证(MFA),这样账户可以拥有最多三个身份验证方法。也就是说,账户可以使用两因素认证(2FA)或三因素认证(3FA”。
authentication_policy
系统变量定义了多因子身份验证(MFA)语句中的约束。例如,authentication_policy
设置控制账户可以拥有的身份验证因数数量,以及每个因数允许的身份验证方法。见配置多因子身份验证策略。
关于确定无插件身份验证默认插件的因素规则,请见默认身份验证插件。
在 auth_option
之后,可能出现不同的可选 MFA take:
-
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
子句,以指定第三因素身份验证方法。以下示例定义了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 相关选项,使用一个指定一个或多个 tls_option
值的 REQUIRE
子句。
REQUIRE
选项的顺序不重要,但不能指定同一个选项两次。AND
关键字在 REQUIRE
选项之间是可选的。
CREATE USER
允许指定这些 tls_option
值:
-
NONE
表示所有由语句命名的账户没有 SSL 或 X.509 要求。未加密连接如果用户名和密码有效则允许,客户端可以选择使用加密连接,如果客户端拥有合适的证书和密钥文件。
CREATE USER 'jeffrey'@'localhost' REQUIRE NONE;
默认情况下,客户端尝试建立安全连接。如果客户端无法建立安全连接,则回退到未加密连接。要要求加密连接,客户端只需要指定
--ssl-mode=REQUIRED
选项;如果无法建立安全连接,则连接尝试失败。如果未指定 SSL 相关的
REQUIRE
选项,NONE
是默认值。 -
SSL
对所有由语句命名的账户要求只能使用加密连接。
CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;
默认情况下,客户端尝试建立安全连接。对于拥有
REQUIRE SSL
的账户,如果无法建立安全连接,则连接尝试失败。 -
X509
对所有由语句命名的账户要求客户端提供有效证书,但证书、颁发机构和主题不重要。唯一的要求是可以使用 CA 证书验证其签名。在这种情况下,总是隐含加密,所以
SSL
选项无需指定。CREATE USER 'jeffrey'@'localhost' REQUIRE X509;
对于具有
REQUIRE X509
的帐户,客户端必须指定--ssl-key
和--ssl-cert
选项以连接。强烈建议同时指定--ssl-ca
,以便服务器验证公钥证书。这也同样适用于ISSUER
和SUBJECT
,因为它们隐含了X509
的要求。 -
ISSUER '
issuer
'对所有由语句命名的帐户,需要客户端提供由CA
'
颁发的有效X.509证书。如果客户端提供了有效但 issuer 不同的证书,服务器将拒绝连接。使用 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
'对所有由语句命名的账户,要求客户端提供有效的 X.509 证书,其中包含主题
subject
。如果客户端提供的证书是有效的,但主题不同,服务器将拒绝连接。在使用 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
值:
-
每小时查询限制
,count
每小时更新限制
,count
每小时连接限制
count
对所有名为该语句的帐户,这些选项限制了每个帐户在任何给定的一个小时内可以执行的查询、更新和连接数目。如果
count
是0
(默认值),那么对该帐户没有限制。 -
用户最大连接数
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 内部存储凭证的账户生效。对于使用外部凭证系统进行身份验证的账户,密码管理必须在该系统中处理。关于内部凭证存储,请见第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 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
天,不允许重复使用 newer than 那么多天的密码。以下语句禁止密码重用360天:CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;
CREATE USER
允许这些 password_option
值来控制是否必须指定当前密码,以验证尝试更改账户密码的用户实际知道当前密码:
-
PASSWORD REQUIRE CURRENT
这个验证选项override了语句中所有账户的全局策略。对于每个账户,它都要求更改密码指定当前密码。
CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
-
PASSWORD REQUIRE CURRENT OPTIONAL
这个验证选项override了语句中所有账户的全局策略。对于每个账户,它不要求更改密码指定当前密码(当前密码可以但不需要提供)。
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"}';
用户注释和用户属性在信息_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)
要设置或更改现有用户评论或用户属性,可以使用一个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
选项,写入到二进制日志的语句中包括该选项。
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
子句。