mariadb,PHP7-无法授予所有数据库特权

时间:2019-08-22 19:01:15

标签: php mysql mariadb

在我的PHP代码中,我尝试了该指令的各种迭代:

        $dbc->exec("CREATE DATABASE $dbName;
                    CREATE USER '$user'@'%' IDENTIFIED BY '$pass';
                    GRANT ALL ON $dbName.* to '$user'@'%' IDENTIFIED BY '$pass';
                    FLUSH PRIVILEGES;")

而且,通过迭代,我的意思是调整数据库特权值:

  • `$ dbName`。*
  • $ dbName。*
  • $ dbName
  • '$ dbName'。*
  • 依此类推...

对于所有尝试,我最终遇到一个使用GRANT USAGE语句创建并且与目标数据库($ dbName)无绑定(关联)的用户。

我唯一一次成功实现此目标的方法就是将特权级别更改为*。*,这将为该用户授予所有数据库的所有权限,而我试图避免这种情况。我只想将授予限制为命名数据库。相反,当我执行一次GRANT ALL或GRANT ALL PRIVILEGES时,每次都会得到以下结果:

MariaDB [(none)]> show grants for someAdmin@localhost;
+-------------------------------------------------------------------------------+
| Grants for someAdmin@localhost       
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'someAdmin'@'localhost' IDENTIFIED BY PASSWORD '[snip]' |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在发出命令后,我也尝试过重新启动mariadb,只是为了查看重新启动是否会强制正确的privs而不会。

什么是向新用户授予数据库上所有特权(带有Grant选项)的正确SQL。授予用户实际上在命名数据库上的所有特权

(PHP 7.2,MariaDB 10.1,Ubuntu 18.04)

  

来自MariaDB文档:

     

全局特权使用*。*授予priv_level。全球   特权包括管理数据库和管理的特权   用户帐户,以及所有表,函数和   程序。全局特权存储在mysql.user表中。

     

使用db_name。*授予priv_level的数据库特权,或者   仅使用*使用默认数据库。数据库特权包括   创建表和函数的权限,以及   数据库中的所有表,函数和过程。数据库   特权存储在mysql.db表中。

2 个答案:

答案 0 :(得分:0)

'$user'@'%'
'someAdmin'@'localhost'

'%' 包含'localhost',而是包含其他所有内容。

正常模式是

CREATE USER            'user'@'...' IDENTIFIED BY '...';
GRANT ALL ON 'db'.* TO 'user'@'...';
                       ^^^^^^^^^^^^
                       These must match exactly.

(过去,GRANTCREATE用户;在将来(MySQL 8.0)它将不会。MariaDB最终可能会朝这个方向发展。)

对于ON 'db'.*,dbname是可选引用的。 (如果未引用,请提防某些标点符号。)*是通配符,表示“所有数据库”。

我认为此上下文允许使用双引号,单引号或反斜杠进行报价。

答案 1 :(得分:0)

此查询组合对我有用:

            $dbc->exec("CREATE DATABASE $dbName;
                        CREATE USER '$user'@'$host' IDENTIFIED BY '$pass';
                        GRANT ALL PRIVILEGES ON $dbName.* to '$user'@'$host' IDENTIFIED BY '$pass';
                        FLUSH PRIVILEGES;")

用户具有通配符:{$ dbname} 权限绑定到新创建的数据库。深入挖掘,我看到用户具有所有能力,包括在新数据库中创建索引和db对象的能力,但格兰特除外,这是我真正需要的。在全球范围内,新用户仍然具有“使用”级别的权限,这也是可取的。

感谢您的问题和帮助-我开始尝试各种不同的事情!