撤销MySQL数据库的权限

70

在您认为这是一个重复的问题之前,我相信我有一个独特的,即使有点愚蠢的情况。

几天前,我将Ubuntu 10.04服务器上的MySQL版本升级到5.3.3(它领先于Ubuntu发布的版本)。今天,我尝试登录phpMyAdmin进行一些操作,但发现了令人担忧的“Connection for controluser as defined in your configuration failed”错误。

在遵循几个SO问题的描述来解决此问题后,我陷入了困境。

  • 我尝试重新配置phpMyAdmin,但没有成功。
  • 我尝试卸载phpMyAdmin并重新安装,但它无法从数据库中删除权限,因此失败了。
  • 然后,我尝试手动删除用户的权限 - 可能有点愚蠢 - 然后删除数据库,再删除用户(使用flush privileges)。
  • 我完全删除了整个phpMyAdmin安装(删除应用程序和/ etc / phpmyadmin目录),然后重新安装(使用apt-get),但它说phpmyadmin用户的权限已经存在:

granting access to database phpmyadmin for phpmyadmin@localhost: already exists

所以,这就是我现在面临的问题。我有一个授权,我既不能修改也不能撤销:

mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost'                                                |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'

不用担心,我不再使用这个密码了,但它是以前使用过的密码,不是我为新的phpmyadmin安装选择的密码。

我该如何完全删除这些授权/权限?如果需要的话,我很乐意从头开始(重新安装phpmyadmin,而不是数据库)。

2个回答

135

在mysql中,USAGE特权的意思是没有为用户'phpadmin'@'localhost'在全局级别*.*上定义的特权。此外,同一用户在数据库phpmyadmin phpadmin.*上拥有所有特权。

因此,如果您想删除所有权限并从头开始,请执行以下操作:

  • 吊销数据库级别上的所有权限:

    REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';

  • 删除用户'phpmyadmin'@'localhost'

    DROP USER 'phpmyadmin'@'localhost';

上述过程将完全从实例中删除用户,这意味着您可以从头开始重新创建用户。

为了给您一些背景知识,当您创建用户时,mysql.user表将被填充。如果您查看其中的记录,您将看到用户和所有特权设置为'N'。如果您执行show grants for 'phpmyadmin'@'localhost';,您将看到上面已经熟悉的输出。简单地翻译为“用户在全局级别没有特权”。现在授予该用户数据库级别的ALL,这将存储在表mysql.db中。如果您执行SELECT * FROM mysql.db WHERE db = 'nameofdb';,您将在每个priv上看到一个'Y'

以上所述显示了当前数据库中的场景。因此,只具有USAGE特权的用户意味着该用户可以连接,但除了SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;之外,他没有其他特权。


2
在此之后,您是否需要执行“FLUSH PRIVILEGES”操作? - Chris Wesseling
直到今天我才能看到这个问题,你的回答解决了权限问题,谢谢。然而,我的“在您的配置中定义为控制用户的连接失败”错误仍然存在,但那是另一个问题。 - Cyntech
1
只需使用“DROP USER”命令,即可完全从mysql.user和mysql.db表中删除用户访问权限。而“REVOKE”命令则只是在指定的权限上将权限标志切换为“N”,但保留用户不变。是的,在执行“REVOKE”语句后,您需要使用“FLUSH PRIVILEGES”命令,但在执行“DROP”操作后则不需要。 - Joey T
请注意,您授予“给”用户并从用户中撤销“取”。我以为撤销命令的关键字与授予命令相同,所以不明白为什么会出现语法错误“ERROR 1064 (42000)”。 - baptx
@JoeyT 在我的情况下,在GRANTREVOKE命令之后不需要使用FLUSH PRIVILEGES命令,其他人也不应该需要:https://dev59.com/cVoV5IYBdhLWcg3wRtAw - baptx

17

顺带提一下,revoke usage on *.* from 'phpmyadmin'@'localhost'; 不起作用的原因非常简单:没有名为 USAGE 的授权。

MySQL 文档中列出了实际命名的授权

授权 USAGE 是一个逻辑授权。为什么呢?因为在 mysql.user 中有一个条目,其 user='phpmyadmin' 且 host='localhost',而 mysql.user 中的任何一行在语义上都意味着 USAGE。运行 DROP USER 'phpmyadmin'@'localhost'; 应该完全可以。在后台,它真正执行的是这个操作:

DELETE FROM mysql.user WHERE user='phpmyadmin' and host='localhost';
DELETE FROM mysql.db   WHERE user='phpmyadmin' and host='localhost';
FLUSH PRIVILEGES;
因此,从 mysql.user 删除一行等同于运行 REVOKE USAGE,尽管实际上无法直接执行 REVOKE USAGE

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