mysql用户和主机优先级

brc7rcf0  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(414)

我有两个用户,我们在两个不同的数据库中称他们为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)

数据库\u 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脚本。连接到数据库\u 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'

我可以在没有问题的情况下在数据库上运行这个。到目前为止,我已经检查了这两个用户的授权,并使用相同的用户和授权(foo@'10.%')登录到mysql shell,但是我无法在数据库1上运行sql脚本。以下是数据库a和数据库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
a64a0gku

a64a0gku1#

不,不能强制连接为特定的用户配置文件。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允许您根据客户机主机定义不同的权限,但这样管理您的授权还是很混乱的。我从来没见过这么做的好理由。
如果需要一组不同的权限,请定义一个不同的用户名。

相关问题