mysql 8 vs mysql 5:为什么通配符在grants命令中表现不好?

myzjeezk  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(391)

我遇到了我的一个老项目(使用mysql 5和php5.5)。我只是想用mysql 8和php7.0测试这个项目。要安装db,我通常会执行以下操作:

...
mysql -u root -p < DBinstall/webAppDBinstall.sql
...

在我的web应用的“安装”脚本中。sql命令包含:

...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...

然后我在运行webapp时从php得到以下错误: $ cat /var/log/apache2/error.log ```
...
[Thu May 28 06:01:26.317867 2020] [:error] [pid 8906] [client 127.0.0.1:32960] PHP Warning: mysqli::query(): Couldn't fetch mysqli in /var/www/webApp/src_php/mylib.php on line 68, referer: http://webApp/index.php?error=0
...

注意:这个项目使用mysql 5和php5运行得非常完美。
然后我觉得“闻起来”就像是特权问题。所以我做了以下工作:

mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------+------------+
| User | Table_name | Table_priv |
+------------+------------+------------+
| php_script | History | Insert |
| php_script | OrderItems | Update |
| php_script | Orders | Update |
| php_script | UserStatus | Update |
+------------+------------+------------+
4 rows in set (0.00 sec)

mysql>


### 是的,就是这样。

证据如下:
我改变了主意 `DBinstall/webAppDBinstall.sql` 脚本来自:

...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...

收件人:

-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.Users TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Categories TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.ProductGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.CategoriesGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Products TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Orders TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.Messages TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON webApp.History TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';

结果是:

mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------------+----------------------+
| User | Table_name | Table_priv |
+------------+------------------+----------------------+
| php_script | History | Select,Insert |
| php_script | Categories | Select,Insert |
| php_script | CategoriesGroups | Select,Insert |
| php_script | Messages | Select,Insert |
| php_script | OrderItems | Select,Insert,Update |
| php_script | Orders | Select,Insert,Update |
| php_script | ProductGroups | Select,Insert |
| php_script | Products | Select,Insert |
| php_script | UserStatus | Select,Insert,Update |
| php_script | Users | Select,Insert |
+------------+------------------+----------------------+
10 rows in set (0.00 sec)

mysql>


#### 关于“为什么在grants中使用通配符”还有更好的想法吗???

(抱歉重复我的问题,但stackoverflow禁止我回答自己的问题)
我的问题是:为什么 `GRANT <PRIVS> ON <DB>.* TO <USER>;` 通配符语法已停止“工作”
注意:此问题与mysqli::query()不同:无法获取mysqli。我的webapp应用程序是一个在mysql 5.x部署下完美运行的系统。它与php无关(尽管 `mysqli` 错误似乎存在,但事实并非如此)。
o8x7eapl

o8x7eapl1#

我刚刚在mysql 8服务器上做了一个测试,成功运行了以下内容:

CREATE DATABASE webApp;
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';

正如我所料,通配符拨款没有任何问题。所以,恐怕你需要在别的地方搜索这个问题。
例如,其中一个示例上的目标数据库名为 webApp 下一个例子的例子是 webAppDB . 所以,最好检查一下名字的一致性。
否则,mysql 8的代码语法看起来还可以。
[编辑]-其他建议
确保 skip-name-resolve 设置为关闭。
在mysql 8上,它看起来是默认关闭的,但是在某些情况下,它可能被设置为打开。
在我的例子中,我在docker容器中运行mysql 8,并且该变量被设置为on。
如果变量设置为on,mysql将不会将localhost解析为localhost的实际ip,在您的情况下,这可能就是问题所在。
有关跳过名称解析的详细信息,请单击此处:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve
确保用 FLUSH PRIVILEGES; 尝试切换 default-authentication-pluginmysql_native_password 默认情况下在mysql 8上 default-authentication-plugin 设置为 caching_sha2_password . 但看起来mysqli不支持这种身份验证方法(根据2018年的这篇文章:https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/)

相关问题