13.7.1.2 CREATE USER 声明

CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...

user:
    (see Section6.2.4, "Specifying Account Names")

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD '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
  | PASSWORD EXPIRE DEFAULT
  | PASSWORD EXPIRE NEVER
  | PASSWORD EXPIRE INTERVAL N DAY
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

CREATE USER语句创建新的 MySQL 帐户。它允许为新帐户构建身份验证,SSL/TLS,资源限制和密码 Management 属性,并控制帐户最初是锁定还是解锁。

要使用CREATE USER,您必须具有全局CREATE USER特权或mysql系统数据库的INSERT特权。启用read_only系统变量后,CREATE USER还需要SUPER特权。

如果您尝试创建一个已经存在的帐户,则会发生错误。如果给出了IF NOT EXISTS子句,则该语句将为每个已存在的命名帐户生成警告,而不是错误。

Important

在某些情况下,CREATE USER可能会记录在服务器日志中或 Client 端的历史记录文件(例如~/.mysql_history)中,这意味着任何具有对该信息的读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节“密码和日志记录”。有关 Client 端日志记录的类似信息,请参见第 4.5.1.3 节“ mysqlClient 端记录”

CREATE USER语句有多个方面,在以下主题下进行了描述:

创建用户概述

对于每个帐户,CREATE USERmysql.user系统 table 中创建一个新行。帐户行反映了语句中指定的属性。未指定的属性设置为其默认值:

  • 身份验证:由default_authentication_plugin系统变量定义的身份验证插件和空凭据

  • SSL/TLS:NONE

  • 资源限制:无限制

  • 密码 Management:PASSWORD EXPIRE DEFAULT

  • 帐户锁定:ACCOUNT UNLOCK

帐户首次创建时没有特权。要分配特权,请使用GRANT语句。

每个帐户名称都使用第 6.2.4 节“指定帐户名”中描述的格式。例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

帐户名的主机名部分(如果省略)默认为'%'

命名帐户的每个* user 值后面都可以有一个可选的 auth_option 值,该值指示帐户如何进行身份验证。这些值使可以指定帐户身份验证插件和凭据(例如密码)。每个 auth_option *值仅适用于紧随其后的命名帐户。

遵循* user *规范,该语句可能包括 SSL/TLS,资源限制,密码 Management 和锁定属性的选项。所有此类选项对语句都是“全局”的,并适用于语句中命名的“所有”帐户。

示例:创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为过期,以便用户在与服务器的第一次连接时必须选择一个新密码:

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

示例:创建一个使用sha256_password身份验证插件和给定密码的帐户。要求每 180 天选择一个新密码:

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH sha256_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY;

示例:创建多个帐户,并指定一些每个帐户属性和一些全局属性:

CREATE USER
  'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password
                                   BY 'new_password1',
  'jeanne'@'localhost' IDENTIFIED WITH sha256_password
                                  BY 'new_password2'
  REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
  ACCOUNT LOCK;

每个* auth_option *值(在这种情况下为IDENTIFIED WITH ... BY)仅适用于紧随其后的名称,因此每个帐户都使用紧随其后的身份验证插件和密码。

其余属性全局应用于语句中命名的所有帐户,因此对于两个帐户:

  • 必须使用有效的 X.509 证书进行连接。

  • 每小时最多允许 60 个查询。

  • 该帐户最初是被锁定的,因此实际上是一个占位符,在 Management 员将其解锁之前无法使用。

创建用户身份验证选项

帐户名后可以带有* auth_option *身份验证选项,该选项指定帐户身份验证插件,凭据或同时指定两者:

    • auth_plugin *命名身份验证插件。插件名称可以是带引号的字符串 Literals 或不带引号的名称。插件名称存储在mysql.user系统 table 的plugin列中。

对于未指定身份验证插件的* auth_option *语法,默认插件由default_authentication_plugin系统变量的值指示。有关每个插件的说明,请参见第 6.4.1 节“身份验证插件”

  • 凭据存储在mysql.user系统 table 中。 'auth_string'值分别以明文(未加密)字符串或以与该帐户相关联的身份验证插件所期望的格式对哈希进行哈希处理来指定帐户凭据:

  • 对于使用BY 'auth_string'的语法,该字符串为 cleartext,并传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在mysql.usertable 中。插件可以使用指定的值,在这种情况下,不会发生哈希。

    • 对于使用AS 'auth_string'的语法,假定该字符串已采用身份验证插件所需的格式,并按原样存储在mysql.usertable 中。如果插件需要散列值,则该值必须已经以适合于该插件的格式进行散列,否则该值将无法被该插件使用,并且不会进行 Client 端连接的正确身份验证。

    • 如果验证插件不对验证字符串进行散列,则BY 'auth_string'AS 'auth_string'子句具有相同的效果:验证字符串按原样存储在mysql.user系统 table 中。

CREATE USER允许以下* auth_option *语法:

  • IDENTIFIED BY 'auth_string'

将帐户身份验证插件设置为默认插件,将明文'auth_string'值传递给该插件以进行可能的散列,并将结果存储在mysql.user系统 table 的帐户行中。

  • IDENTIFIED WITH auth_plugin

将帐户身份验证插件设置为* auth_plugin *,清除凭据为空字符串,并将结果存储在mysql.user系统 table 的帐户行中。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

将帐户身份验证插件设置为* auth_plugin *,将明文'auth_string'值传递给该插件以进行可能的散列,并将结果存储在mysql.user系统 table 的帐户行中。

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

将帐户身份验证插件设置为* auth_plugin *,并按原样在mysql.user帐户行中存储'auth_string'值。如果插件需要哈希字符串,则假定该字符串已经以插件所需的格式进行哈希处理。

  • IDENTIFIED BY PASSWORD 'auth_string'

将帐户身份验证插件设置为默认插件,并将'auth_string'值原样存储在mysql.user帐户行中。如果插件需要哈希字符串,则假定该字符串已经以插件所需的格式进行哈希处理。

Note

IDENTIFIED BY PASSWORD语法已被弃用,并将在将来的 MySQL 版本中删除。

示例:将密码指定为明文;使用默认插件:

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';

示例:指定身份验证插件以及明文密码值:

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password BY 'password';

在每种情况下,存储在帐户行中的密码值在被与该帐户关联的身份验证插件散列后为明文值'password'

有关设置密码和身份验证插件的其他信息,请参见第 6.2.10 节“分配帐户密码”第 6.2.13 节“可插入身份验证”

CREATE USER SSL/TLS 选项

除基于用户名和凭据的常规身份验证外,MySQL 还可以检查 X.509 证书属性。有关在 MySQL 上使用 SSL/TLS 的背景信息,请参见第 6.3 节“使用加密的连接”

要为 MySQL 帐户指定与 SSL/TLS 相关的选项,请使用REQUIRE子句,该子句指定一个或多个* tls_option *值。

REQUIRE选项的 Sequences 无关紧要,但不能指定两次选项。 AND关键字在REQUIRE个选项之间是可选的。

CREATE USER允许以下* tls_option *值:

  • NONE

指示该语句命名的所有帐户都没有 SSL 或 X.509 要求。如果用户名和密码有效,则允许未加密的连接。如果 Client 端具有正确的证书和密钥文件,则可以选择使用加密连接。

CREATE USER 'jeffrey'@'localhost' REQUIRE NONE;

Client 端默认尝试构建安全连接。对于具有REQUIRE NONE的 Client 端,如果无法构建安全连接,则连接尝试将退回到未加密的连接。要要求加密连接,Client 端只需要指定--ssl-mode=REQUIRED选项即可;如果无法构建安全连接,则连接尝试将失败。

如果未指定与 SSL 相关的REQUIRE选项,则默认为NONE

  • SSL

告诉服务器仅允许该语句命名的所有帐户的加密连接。

CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;

Client 端默认尝试构建安全连接。对于具有REQUIRE SSL的帐户,如果无法构建安全连接,则连接尝试将失败。

  • X509

对于该语句命名的所有帐户,要求 Client 出示有效的证书,但是确切的证书,颁发者和主题并不重要。唯一的要求是,应该可以使用其中一个 CA 证书来验证其签名。 X.509 证书的使用始终意味着加密,因此在这种情况下不需要SSL选项。

CREATE USER 'jeffrey'@'localhost' REQUIRE X509;

对于具有REQUIRE X509的帐户,Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)ISSUERSUBJECT也是如此,因为这些REQUIRE选项暗示了X509的要求。

  • ISSUER 'issuer'

对于该语句命名的所有帐户,要求 Client 端出示由 CA 'issuer'颁发的有效 X.509 证书。如果 Client 端出示的证书有效但具有不同的颁发者,则服务器将拒绝连接。 X.509 证书的使用始终意味着加密,因此在这种情况下不需要SSL选项。

CREATE USER 'jeffrey'@'localhost'
  REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/[email protected]';

由于ISSUER隐含了X509的要求,因此 Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)

  • SUBJECT 'subject'

对于该语句命名的所有帐户,要求 Client 端出示包含主题* subject *的有效 X.509 证书。如果 Client 端出示的证书有效但主题不同,则服务器拒绝连接。 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'值与证书中的值进行了简单的字符串比较,因此,字母和组件的 Sequences 必须完全按照证书中的 Sequences 给出。

由于SUBJECT隐含了X509的要求,因此 Client 端必须指定--ssl-key--ssl-cert选项进行连接。 (建议但不要求也指定--ssl-ca,以便可以验证服务器提供的公共证书。)

  • CIPHER 'cipher'

对于该语句命名的所有帐户,都需要使用特定的加密方法来加密连接。需要使用此选项以确保使用足够强度的密码和密钥长度。如果使用使用短加密密钥的旧算法,则加密可能会很弱。

CREATE USER 'jeffrey'@'localhost'
  REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUERCIPHER选项可以在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';
创建用户资源限制选项

第 6.2.16 节“设置帐户资源限制”中所述,可以限制帐户对服务器资源的使用。为此,请使用WITH子句指定一个或多个* resource_option *值。

WITH选项的 Sequences 无关紧要,除非多次指定给定的资源限制,则以最后一个实例为准。

CREATE USER允许以下* resource_option *值:

  • MAX_QUERIES_PER_HOUR count , MAX_UPDATES_PER_HOUR count , MAX_CONNECTIONS_PER_HOUR count

对于该语句命名的所有帐户,这些选项限制在任何给定的一小时内允许每个帐户进行多少次查询,更新和与服务器的连接。 (从查询缓存中提供结果的查询不计入MAX_QUERIES_PER_HOUR限制.)如果* count *为0(默认值),则 table 示该帐户没有限制。

  • MAX_USER_CONNECTIONS count

对于该语句命名的所有帐户,限制每个帐户同时连接到服务器的最大数量。非零* count 明确指定帐户的限制。如果 count *是0(缺省值),则服务器根据max_user_connections系统变量的全局值确定该帐户的并发连接数。如果max_user_connections也是零,则该帐户没有限制。

Example:

CREATE USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
CREATE USER 密码 Management 选项

帐户密码的使用期限是根据最近一次密码更改的日期和时间计算得出的。

CREATE USER支持多个* password_option *值用于密码过期 Management,以手动使帐户密码过期或构建其密码过期策略。策略选项不会使密码失效。相反,它们根据帐户密码的使用期限来确定服务器如何将自动过期应用于帐户。对于给定的帐户,将从最近一次密码更改的日期和时间开始评估其密码使用期限。

本节介绍密码 Management 选项的语法。有关构建密码 Management 策略的信息,请参阅第 6.2.11 节“密码 Management”

如果指定了多个密码 Management 选项,则最后一个优先。

这些选项仅适用于使用身份验证插件的帐户,该身份验证插件将凭据内部存储在 MySQL 中。对于使用插件对 MySQL 外部的凭据系统执行身份验证的帐户,密码 Management 也必须在外部针对该系统进行处理。有关内部凭据存储的更多信息,请参见第 6.2.11 节“密码 Management”

如果帐户密码已手动过期,或者根据自动过期策略,认为密码使用期限大于允许的使用期限,则 Client 端会话将在受限模式下运行。在受限模式下,会话中执行的操作会导致错误,直到用户构建新的帐户密码为止。有关受限模式的信息,请参见第 6.2.12 节“过期密码的服务器处理”

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 帐户锁定选项

MySQL 使用ACCOUNT LOCKACCOUNT UNLOCK选项支持帐户锁定和解锁,这两个选项指定了帐户的锁定状态。有关其他讨论,请参见第 6.2.15 节“锁定帐户”

如果指定了多个帐户锁定选项,则最后一个优先。