MySQL/MariaDB:'GRANT ... IDENTIFIED BY'与'CREATE USER'并配合'GRANT'有什么区别?

4

在设置数据库时,我通常使用以下方式创建用户:

CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';

然后在数据库上为用户授予权限:

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';

我经常看到这两个命令一起使用,被认为是做这件事的方法。然而,我发现如果跳过CREATE USER命令直接使用GRANT,用户似乎会自动创建并能正常工作。 是否仍应在GRANT之前使用CREATE USER?或者这只是一种旧的惯例,可能是为了向后兼容?
2个回答

3

MySQL曾支持通过授予权限隐式创建用户。这种用法使得GRANT操作是幂等和复制安全的。例如,当在副本上可能存在或不存在用户时,GRANT会在用户不存在时创建该用户。如果用户已经存在,则GRANT仍然有效,并在需要时添加权限。

当以这种方式使用GRANT时,使用IDENTIFIED BY子句设置密码是可选的。如果用户已经存在,则不需要使用IDENTIFIED BY,因为该用户已经有一个密码。如果用户不存在,则省略IDENTIFIED BY将隐式地创建用户,但没有密码(即任何人都可以使用该用户登录而无需输入密码)。

这被认为是一种安全风险。例如,如果有人在使用GRANT时忘记了在用户名上拼写错误,那么就可能不小心创建一个具有特权但没有密码的新用户。

GRANT ALL ON *.* TO 'ruhnett'@'%';  -- misspelled username creates new user

这将允许任何人以新用户身份登录并获取特权访问。

因此,在MySQL 5.7中,使用GRANT隐式创建用户已被弃用。

CREATE USER ... IF NOT EXISTS语法取代了幂等用户创建。这鼓励开发人员更加明确地表达他们是想创建用户还是想授予现有用户权限。


2

在MySQL 8.0中,你正在进行的操作是无效的。在GRANT命令中自动创建用户的能力已被删除,你需要首先使用CREATE USER


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