1

我有一个用户' myuser'和两个数据库。' db1' 和 ' db2'。

myuser”已经拥有使用权db1,我想db2通过使用以下查询授予他使用“ ”的额外权限:

GRANT ALL ON db2.* TO 'myuser'@'localhost';

在我运行授权语句后,' myuser'失去了与第一个数据库的连接' db1'

恐怕我使用了错误的主机名。我应该使用 '%' 而不是 'localhost'。当我做:

 select host from mysql.user where user = 'myuser';

现在我看到该用户的两条主机记录'%'和“ ”localhost

当我运行 SHOW GRANT 语句时,我获得了不同主机的权限。“本地主机”和“%”。

mysql> SHOW GRANTS FOR 'myuser'@'localhost';
+----------------------------------------------------------------------+
| Grants for myuser@localhost                                      |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myuser'@'localhost'                       |
| GRANT ALL PRIVILEGES ON `beta_version`.* TO 'myuser'@'localhost' |
+----------------------------------------------------------------------+

mysql> SHOW GRANTS FOR 'myuser'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for myuser@%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myuser'@'%' IDENTIFIED BY PASSWORD '*6ASDFASDFASDF...' 
| GRANT ALL PRIVILEGES ON `myuser`.* TO 'myuser'@'%'                                                
+-----------------------------------------------------------------------------------------------------------+

发生了什么导致 ' myuser' 在我的 PHP 脚本和 phpMyAdmin 中不起作用?

4

2 回答 2

2

MySQL 通过用户名和主机来识别用户。当 MySQL 在登录时进行身份验证时,MySQL 首先查找一个完全匹配的主机名。如果它没有找到完全匹配,那么它会寻找一个包含“%”通配符的主机。

当您执行 时GRANT ... TO myuser@localhost,MySQL 创建了一个新用户(没有密码,因为语句中没有IDENTIFIED BY给出。

然后发生了什么,当您尝试myuser从 localhost 登录时,mysqld 尝试'myuser'@'localhost'在 mysql.user 表中查找匹配的条目并找到它。并且会话获得了分配给该用户的权限。

(更准确地说,mysqld 并没有真正查看 mysql.user 表的内容,它真正查看的是内存中的结构,该结构是在构建时从表中填充的。内存结构由 GRANT、REVOKE 或 FLUSH PRIVILEGES 语句触发。)

在添加新用户之前发生了什么,mysqld 正在寻找用户和主机名的完全匹配,但没有找到。但它确实找到了一个带有 '%' 通配符的条目,所以它与之匹配,因此会话获得了授予 'myuser'@'%' 用户的所有权限。


两个用户 'u'@'%''u'@'localhost'是分开的并且彼此不同。特权必须单独授予每个用户。授予的任何特权'u'@'%'仅适用于该用户而不适用于'u'@'localhost'.

于 2012-12-22T00:05:10.057 回答
0

USAGE的意思是“没有权限,这就是您在从 localhost 连接时为用户提供的权限。

我认为 localhost 优先于 % 所以当用户从 localhost 连接时,这就是将使用的授权。

将两种模式的访问权限授予 % (或 localhost,如果您愿意的话),它应该清楚并且工作得更好。

于 2012-12-21T21:26:39.523 回答