我有一个用户'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中无效的情况发生了什么?
答案 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),并且应该清楚并且工作得更好。