CREATE USER
user [auth_option] [, user [auth_option]] ...
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY [PASSWORD] 'auth_string'
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
}
该CREATE USER
语句创建新的 MySQL 帐户。如果您尝试创建一个已经存在的帐户,则会发生错误。
要使用CREATE USER
,您必须具有全局CREATE USER
权限或系统数据库INSERT
权限
。mysql
当
read_only
启用系统变量时,CREATE USER
额外需要SUPER
权限。
在某些情况下,CREATE
USER
可能会记录在服务器日志中或在客户端的历史文件中,例如
~/.mysql_history
,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅
第 4.5.1.3 节,“mysql 客户端日志记录”。
对于每个帐户,CREATE USER
在系统表中创建一个没有权限的新行,mysql.user
并为该帐户分配一个身份验证插件。根据使用的语法,
CREATE USER
还可以为帐户分配一个密码。
首次创建的帐户没有特权。要分配权限,请使用该GRANT
语句。
每个user
命名帐户的值后面都可以跟一个可选
auth_option
值,该值指定如何为使用该帐户的客户端进行身份验证。这部分CREATE USER
语法与 共享GRANT
,因此此处的描述也适用于GRANT
。
每个帐户名都使用 第 6.2.4 节“指定帐户名”中描述的格式。例如:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
帐户名的主机名部分(如果省略)默认为
'%'
.
服务器为每个帐户分配一个身份验证插件和密码,具体取决于用户规范子句是否包含IDENTIFIED BY
或
IDENTIFIED WITH
指定身份验证信息:
使用
IDENTIFIED BY
,服务器隐式分配插件。该 值是明文,并传递给插件以进行可能的哈希处理。插件返回的结果存储为密码。插件可以使用指定的值,在这种情况下不会发生散列。如果给出了可选 关键字,则行为是相同的,除了如果插件需要散列字符串,则假定该字符串已经按照插件要求的格式散列,并按原样存储为密码。'
auth_string
'PASSWORD
使用
IDENTIFIED WITH
,服务器分配指定的插件并且该帐户没有密码。如果给出了可选子句,则字符串将按原样存储为密码。如果插件需要哈希字符串,则假定该字符串已经按照插件所需的格式进行了哈希处理。AS '
auth_string
'对于 neither
IDENTIFIED BY
norIDENTIFIED WITH
,服务器隐式分配插件并且帐户没有密码。
如果账户没有密码,则mysql.user
表中账户行的密码信息为空,不安全。要设置密码,请使用
SET PASSWORD
。请参阅
第 13.7.1.7 节,“SET PASSWORD 语句”。
对于隐式插件分配,默认插件成为plugin
帐户
mysql.user
系统表行中列的值。
除非在服务器启动时以其他方式设置
mysql_native_password
该
选项,否则默认插件是。--default-authentication-plugin
对于使用给定帐户的客户端连接,服务器调用分配给该帐户的身份验证插件,并且客户端必须根据插件实现的身份验证方法的要求提供凭据。如果服务器在帐户创建时或连接时找不到插件,则会发生错误。
如果帐户的mysql.user
表行有一个非空plugin
列:
服务器使用命名插件验证客户端连接尝试。
SET PASSWORD
使用with 更改帐户密码PASSWORD()
必须将old_passwords
系统变量设置为身份验证插件所需的值,以便PASSWORD()
使用适当的密码哈希方法。如果插件是mysql_old_password
,也可以使用SET PASSWORD
with 更改密码OLD_PASSWORD()
,它使用 pre-4.1 密码散列,而不管 的值old_passwords
。
如果帐户的mysql.user
表格行有一个空plugin
列:
mysql_native_password
服务器使用或 身份验证插件对 客户端连接尝试进行mysql_old_password
身份验证,具体取决于Password
列中存储的密码的哈希格式。SET PASSWORD
可以 使用 更改帐户密码PASSWORD()
,old_passwords
分别为 4.1 或 4.1 之前的密码哈希设置为 0 或 1,或者使用OLD_PASSWORD()
,无论 的值如何,它都使用 4.1 之前的密码哈希old_passwords
。
CREATE USER
例子:
要为帐户指定身份验证插件,请使用 . 插件名称可以是带引号的字符串文字或不带引号的名称。 是传递给插件的可选带引号的字符串文字。插件解释字符串的含义,因此它的格式是特定于插件的,并且它存储在 给定的列中。(此值仅对使用该列的插件有意义。)有关给定插件接受的身份验证字符串值(如果有)的信息,请参阅给定插件的文档。
IDENTIFIED WITH
auth_plugin
'
auth_string
'authentication_string
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password;
服务器将给定的身份验证插件分配给帐户,但没有密码。客户端在连接时不得提供密码。但是,没有密码的帐户是不安全的。要确保帐户使用特定的身份验证插件并具有具有相应哈希格式的密码,请使用 明确指定插件
IDENTIFIED WITH
,然后使用SET PASSWORD
设置密码:CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password; SET old_passwords = 0; SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');
SET PASSWORD
使用with 更改帐户密码PASSWORD()
必须将old_passwords
系统变量设置为帐户身份验证插件所需的值,以便PASSWORD()
使用适当的密码哈希方法。因此,要改用sha256_password
或mysql_old_password
插件,请在CREATE USER
语句中命名该插件,并old_passwords
在使用 之前分别将其设置为 2 或 1SET PASSWORD
。(mysql_old_password
不推荐使用。它已被弃用;希望在未来的 MySQL 版本中删除对它的支持。)要在帐户创建时为帐户指定密码,请使用
IDENTIFIED BY
文字明文密码值:CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
如前所述,服务器隐式地将身份验证插件分配给帐户,并分配给定的密码。客户端在连接时必须提供给定的密码。
如果隐式分配的插件是
mysql_native_password
,则old_passwords
系统变量必须设置为 0。否则,CREATE USER
不会以插件要求的格式散列密码,并发生错误:mysql> SET old_passwords = 1; mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password'; ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. mysql> SET old_passwords = 0; mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.00 sec)
如果您知道其散列值(
PASSWORD()
将为密码返回的值),要避免指定明文密码,请在关键字之前指定散列值PASSWORD
:CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';
如前所述,服务器隐式地将身份验证插件分配给帐户,并分配给定的密码。密码哈希必须采用指定插件所需的格式。客户端在连接时必须提供密码。
要使用户无需密码即可连接,请不包含
IDENTIFIED BY
子句:CREATE USER 'jeffrey'@'localhost';
如前所述,服务器隐式地为帐户分配一个身份验证插件,但没有密码。客户端在连接时不得提供密码。但是,没有密码的帐户是不安全的。为避免这种情况,请使用
SET PASSWORD
设置帐户密码。
如前所述,隐式插件分配取决于默认身份验证插件。的允许值
--default-authentication-plugin
是mysql_native_plugin
和
sha256_password
,但不是
mysql_old_password
。这意味着无法设置默认插件以便能够创建使用mysql_old_password
with
CREATE USER ... IDENTIFIED BY
语法的帐户。要创建一个使用 的帐户,请使用
mysql_old_password
明确CREATE USER
... IDENTIFIED WITH
命名插件,然后设置密码:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_old_password;
SET old_passwords = 1;
SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');
但是,不推荐使用上述过程,因为
mysql_old_password
它已被弃用。
有关设置密码和身份验证插件的其他信息,请参阅 第 6.2.9 节,“分配帐户密码”和 第 6.2.11 节,“可插入身份验证”。