2013-07-23 173 views
40

在您认为这是一个重复问题之前,我认为我有一个独特的,即使它有点暗淡的情况。从MySQL数据库中删除权限

几天前,我将Ubuntu 10.04服务器上的MySQL版本升级到了5.3.3(它比10.04版本的Ubuntu版本高出一些)。今天,我试图登录到phpMyAdmin的东西,发现有些可怕的Connection for controluser as defined in your configuration failed错误。

经过几个关于如何解决这个问题的SO问题的描述之后,我陷入了困境。

  • 我试图reconfigure phpMyAdmin,没有成功。
  • 我试图uninstall phpMyadmin and reinstall它,但它不能删除数据库的权限和失败。
  • 然后我试图从用户的manually remove the privileges - 有点愚蠢,我可能会添加 - 从数据库,然后删除数据库,然后用户(与flush privileges)。
  • 我放弃了完全的phpMyAdmin整个安装(删除应用程序,并在/ etc/phpMyAdmin的目录),并重新安装(使用apt-get的),但它表示,对于phpMyAdmin的用户的权限已经存在:

granting access to database phpmyadmin for [email protected]: already exists

所以,这是我留下的。我有我不能修改,也没有撤销授予:

mysql> show grants for 'phpmyadmin'@'localhost'; 
+-------------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                     | 
+-------------------------------------------------------------------------------------------------------------------+ 
| 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,而不是数据库)。

回答

82

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';,你会看到上面输出的allready familliar。简单地转换为“全球范围内对用户没有特权”。现在您在数据库级别授予此用户ALL,这将存储在表mysql.db中。如果您执行SELECT * FROM mysql.db WHERE db = 'nameofdb';,您将在每个priv上看到一个'Y'

上面介绍了目前您在db中使用的场景。因此,拥有仅具有USAGE权限的用户意味着该用户可以连接,但是除了SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;之外,他没有其他特权。

+2

在这之后你有'FLUSH PRIVILEGES'吗? –

+0

直到今天我都看不到这个问题,并且您的答案解决了特权问题,谢谢。但是,我的'Connection for controluser在配置中定义失败'错误仍然存​​在,但这是一个不同的问题。 – Cyntech

+1

'DROP USER'是您需要从mysql.user和mysql.db表中完全删除用户访问权限所需的全部内容。 'REVOKE'只是将权限标志切换为'N',在其中的一个或两个表中为指定的权限,但保持用户不变。是的,你需要在'REVOKE'语句后'FLUSH PRIVILEGES',而不是在'DROP'操作之后。 –

12

作为一个方面说明,原因revoke usage on *.* from 'phpmyadmin'@'localhost';不起作用很简单:没有拨款称为USAGE

The actual named grants are in the MySQL Documentation

该准许USAGE是逻辑准许。怎么样? 'phpmyadmin'@'localhost'在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不能随便被执行。