"IDENTIFIED BY 'password'" in MySQL

73

我经常在许多MySQL教程中看到人们在创建用户并授予权限时使用IDENTIFIED BY 'password'命令。

例如:

在许多MySQL教程中,我经常看到人们在创建用户和授予权限时都使用IDENTIFIED BY 'password'命令。

例如:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost' IDENTIFIED BY 'password';

我曾尝试使用GRANT而没有使用IDENTIFIED BY也可以正常工作。
有人能解释一下为什么要使用两次吗?是否还有其他特定权限的密码?


有人可以解释一下为什么要使用两次吗?是否还可能存在其他用于特定权限的密码?


授予没有“identified by”的权限是有效的,这样你就可以在没有密码的情况下访问你的数据库模式。 - Giorgi Tsiklauri
5个回答

94
GRANT 用于给用户添加权限,但它也具有创建用户和更改密码的功能。这种功能已被弃用,不应再使用。GRANT 结合 IDENTIFIED 使用可以更改用户的密码:

当存在 IDENTIFIED 并且您拥有全局授权特权(GRANT OPTION)时,任何指定的密码都将成为该帐户的新密码,即使该帐户已经存在并且已经有一个密码。如果没有 IDENTIFIED,则帐户密码保持不变。

从 MySQL 5.7.2 开始,如果帐户已经存在,则禁止使用 IDENTIFIED WITH,因为它仅用于创建新帐户。

GRANT 还可能在用户不存在时创建用户:

如果 GRANT 语句中指定的账户不存在,则执行的操作取决于 NO_AUTO_CREATE_USER SQL 模式:

  • 如果未启用 NO_AUTO_CREATE_USER,则 GRANT 创建该帐户。除非使用 IDENTIFIED BY 指定非空密码,否则非常不安全。
  • 如果启用了 NO_AUTO_CREATE_USER,则 GRANT 失败并且不会创建该帐户,除非使用 IDENTIFIED BY 指定非空密码或者使用 IDENTIFIED WITH 名称身份验证插件。

MySQL 5.7.6 版本起,已弃用使用 GRANT 定义帐户身份验证特征。改为使用 CREATE USER 或 ALTER USER 建立或更改身份验证特征。该 GRANT 功能将在未来的 MySQL 版本中删除。

详见 https://dev.mysql.com/doc/refman/5.7/en/grant.html

总之,使用 CREATE 创建用户,使用 GRANT 添加权限。

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost'; 

2
WordPress手册仍在使用那种语法,而我的全新MySQL安装不接受它。我花了两个小时。 - Siavoshkc
1
为了在以后更改密码,请使用 ALTER USER。 - Phil
我也有和Sia一样的问题 https://ubuntu.com/tutorials/install-and-configure-wordpress#4-configure-database - Pradeep Singh

13

为了授予自己创建的用户权限,下面这行代码已足够:

GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost' IDENTIFIED BY 'password';
注意:Identify代表您想要为凭据验证保存的密码。 新更新: 在MySQL 8.0中,您必须先创建用户,然后再分配权限,因为GRANT命令不再创建新用户。 因此,在MySQL 5.7之前,您可以通过GRANT单个命令创建和分配权限,例如GRANT SELECT ON *.* TO 'USER'@'IP' IDENTIFIED BY 'PASS'; 注意:最好的选择仍是首先创建用户,然后按照标准流程分配权限。 但自MySQL 8.0以来,您必须先创建用户,然后才能分配权限,例如 CREATE USER 'USER'@'IP' IDENTIFIED BY 'PASS'; GRANT SELECT ON *.* TO 'USER'@'IP';

嗨,Zafar,我仍然不明白为什么这些教程中不能:1.)我们添加用户并设置密码: CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';2.)然后我们授予权限(跳过identified部分) GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost';我认为结果应该是一样的?我错了吗? - user3461823
在第一个命令中,您已经创建了一个用户,但没有定义该用户需要哪种类型的特权...在第二个命令中,您提供了全部、仅选择或带有更新等特权...第一个命令已经包含在第二个命令中,即如果您使用授权命令,则会自动创建用户(如果用户不存在),如果用户存在,则只需更改权限... - Zafar Malik
7
在MySQL 5.7中,该功能已被淘汰且令人困惑。密码应该使用“CREATE USER”或“ALTER USER”来设置。 - SystemParadox

5

来自MySQL 5.7文档的说法:

然而,在MySQL 5.7中使用GRANT创建账户或定义非权限特性已经不建议使用。相反,应该使用CREATE USER或ALTER USER来执行这些任务。

但我在MySQL 8.0文档中无法找到类似的提示或消息,我尝试过:

grant all privileges on dbname . * to newuser@localhost;

返回结果:

错误:您不被允许使用GRANT创建用户

并且使用identified by:

grant all privileges on dbname . * to newuser@localhost  identified by 'passw0rd';

返回:

你的 SQL 语法有误;请检查与你的 MySQL 服务器版本相对应的手册,确认正确的语法用法,第 1 行附近出现了 'identified by 'passw0rd''

根据 MySQL 8.0 文档所述:

通常,数据库管理员首先使用 CREATE USER 创建帐户并定义其非特权特征,例如密码、是否使用安全连接以及对服务器资源的访问限制,然后使用 GRANT 定义其权限。 ALTER USER 可用于更改现有帐户的非特权特征。

如果您想创建用户并授予权限,请使用:

CREATE USER 'user'@'localhost' IDENTIFIED BY 'passw0rd';
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost'; 

如果想要更新密码,首先使用 alter 命令:

ALTER USER 'user'@'localhost' IDENTIFIED BY 'passw0rd';
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost'; 

2

尝试了你的想法,不过需要稍微修改一下才能让它正常运行而没有错误。不确定为什么,但它可以运作。

CREATE DATABASE radius_db;

CREATE USER 'radius_user'@'localhost' IDENTIFIED BY 'Somestrongpassword_321';

GRANT ALL PRIVILEGES ON radius_db.* TO 'radius_user'@'localhost';

FLUSH PRIVILEGES;

quit;

0

这只是一种额外的安全措施。例如,在共享主机环境中,您可能为同一用户在不同服务器上具有不同的密码。如果这是您自己的服务器,并且您和您的同事是唯一使用它的人,则无需识别您授予权限的用户。

如果您标识用户,则只能使用您指定的密码才能与该用户一起执行这些特权。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接