MySQL用户和主机优先级

时间:2018-12-05 20:19:35

标签: mysql privileges grant

我有两个用户,让我们在两个不同的数据库上将它们称为foo:

数据库A:

mysql> select user,host from user where user = 'foo';
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| foo | %         |
| foo | 10.%      |
| foo | localhost |
+-----------+-----------+
3 rows in set (0.01 sec)

数据库B:

mysql> select user,host from user where user = 'foo';
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| foo | %         |
| foo | 10.%      |
| foo | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

现在我遇到的问题是尝试运行带有DROP命令的SQL脚本。当我连接到Database_A上的数据库时,尝试连接时出现错误:

mysql -A -hdatabase_1.foo.bar.domain.com -ufoo -pbar Database_A <dbtables.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1142 (42000) at line 22: DROP command denied to user 'foo'@'ip-10-128-0-143.ec2.internal' for table 'bar_table'

我可以在Database_B上运行此程序,而不会出现任何问题。到目前为止,我已经检查了两个用户的授权,并使用相同的用户和授权(foo@'10.%')登录到MySQL shell,但是我无法在database_1上运行SQL脚本。以下是Database_A和Database_B的授予情况:

mysql> show grants for foo;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for foo@%                                                                                                                                                                         |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, RELOAD ON *.* TO 'foo'@'%' IDENTIFIED BY PASSWORD '<redacted>' REQUIRE SSL                                                                  |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `reference`.* TO 'foo'@'%' |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show grants for foo@'10.%';
+------------------------------------------------------------------------------------------------------------+
| Grants for foo@10.%                                                                                  |
+------------------------------------------------------------------------------------------------------------+
| GRANT FILE ON *.* TO 'foo'@'10.%' IDENTIFIED BY PASSWORD '<redacted>' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

现在,我似乎无法弄清楚为什么一个数据库服务器可以与另一个数据库服务器一起工作(两者都使用用户和my.cnf文件进行了完全相同的设置)。有什么方法可以专门以foo @'%'的身份登录?我正在尝试从远程EC2实例(相同的VPC)运行此代码:

mysql -A -hdatabase_1.foo.bar.domain.com -ufoo -pbar Database_A <dbtables.sql

1 个答案:

答案 0 :(得分:1)

否,您不能强制将连接设置为特定的用户配置文件。 MySQL根据其排序顺序使用第一个匹配的配置文件。

阅读https://dev.mysql.com/doc/refman/8.0/en/connection-access.html

  

当可能有多个匹配项时,服务器必须确定   他们使用。它可以按以下方式解决此问题:

     
      
  • 每当服务器将用户表读入内存时,它就会对行进行排序。

  •   
  • 当客户端尝试连接时,服务器将按排序顺序浏览行。

  •   
  • 服务器使用与客户端主机名和用户名匹配的第一行。

  •   
     

服务器使用排序规则,对最具体的行进行排序   首先托管值。文字主机名和IP地址最多   具体。 (文字IP地址的特异性不受   是否具有子网掩码,所以198.51.100.13和   198.51.100.0/255.255.255.0被认为是同样特定的。)模式'%'表示“任何主机”,并且是最低特定的。空字符串   ”也表示“任何主机”,但在“%”之后排序。具有相同主机的行   值先按最特定的用户值排序(空白   用户值表示“任何用户”,并且是最不明确的)。对于具有   主机和用户值完全相同,顺序不确定。

我将避免为同一用户名赋予不同的特权,只是主机名有所不同。

尽管MySQL允许您根据客户端主机定义不同的特权,但以这种方式管理授权仍然令人困惑。我从未见过这样做的充分理由。

如果您需要一组独特的特权,请定义一个独特的用户名。