授予其他MySQL数据库权限导致问题

时间:2012-12-21 21:15:16

标签: mysql

我有一个用户'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语句时,我获得了不同主机的权限。 'localhost'和'%'。

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中无效的情况发生了什么?

2 个答案:

答案 0 :(得分:2)

MySQL通过BOTH用户名和主机识别用户。当MySQL在登录时进行身份验证时,MySQL首先会查找完全匹配的主机名。如果找不到完全匹配,则它会查找包含'%'通配符的主机。

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

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

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

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


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

答案 1 :(得分:0)

USAGE表示“没有权限,这是您从localhost连接时为用户提供的权限。

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

将这两个架构的访问权限授予%(或者如果你喜欢的话,则为localhost),并且应该清楚并且工作得更好。