如何将对数据库拥有所有权限的 mysql 用户更改为仅对一个特定表拥有选择权限?

如何将对数据库拥有所有权限的 mysql 用户更改为仅对一个特定表拥有选择权限?

我为我的 mysql 用户授予了“授予 my_user@localhost 的所有数据库名称权限”的权限。现在我想更细致地处理,首先降低特定表的权限。

我希望 mysql 具有或可以设置为遵循“最少权限”策略,这样我就可以保留当前设置并降低一个表的权限。但我在文档或网上没有看到类似的东西。

除了删除数据库级别的授予并在表级别重新授予之外,是否有办法通过添加另一条规则来获得相同的结果?

答案1

MySQL 中的所有权限都是加性的;没有减性权限的概念。

您必须删除GRANT ALL ON db.* ...并分配您想要的细粒度表级权限。

请记住,你有一个非常广泛的特权MySQL 中可供您使用。也许您可以从为GRANT SELECT您的用户提供只读访问权限的数据库级别开始。然后,您可以根据需要有选择地按表添加破坏性权限。

答案2

不幸的是,如果用户已经具有数据库级权限,则运行revoke all on db.table from user@host;不会为您创建所有现有的表级权限(您要撤销的权限除外)。

我能想到的最好的方法是向用户添加所需的所有表级权限,然后撤销数据库级权限。

mysqlMySQL根据权限的上下文将其权限保存在数据库的不同表中。

  • 如果您授予权限,*.*它将进入mysql.User表中。
  • 如果您授予权限,db.*它将进入mysql.db表中。
  • 如果您授予权限,db.table它将进入mysql.tables_priv表中。
  • 如果您授予列权限,db.table它将进入mysql.columns_priv表中。

因此,运行下面的最终撤销只会从表中删除条目db并保留表中所已有的所有内容tables_priv

例如:用户已经拥有这个:

mysql> grant all on db.* to user@host;

你运行这个:

mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;

在您运行撤销命令之前,用户将一直可以访问db.table5。撤销之前和之后,用户都可以访问其他四个表。

例外情况(总是有例外)是列权限。如果您将列权限授予已拥有同一表的表级权限的用户,这些权限将存在于表中,columns_priv但不会显示在show grants命令中,并且如果您运行命令,这些权限将消失revoke ... on db.table from user@host;

您应该能够编写脚本来添加所有表级权限,而不是手动创建它们。

相关内容