MySQL将通配符数据库名称的权限授予新用户

时间:2014-12-06 18:38:36

标签: mysql

我试图通过权限尽可能地限制我的MySQL用户帐户,只为我需要的东西提供最低限度。

我有一个名为creator的用户,我想用它来创建新用户,创建新数据库,并将这些用户权限分配给这些数据库,但仅限于某种格式的数据库。

要创建creator用户,我有以下内容(以root身份运行):

GRANT CREATE USER, CREATE ON *.* TO 'creator'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON `my_prefix\_%`.* TO 'creator'@'localhost' WITH GRANT OPTION;

现在我假设这将使我能够创建一个新用户,并为匹配my_prefix_%的表分配任何权限,但似乎并非如此。以creator用户身份运行以下查询会给我一个错误。

CREATE DATABASE IF NOT EXISTS `my_prefix_test`;
CREATE USER 'test'@'localhost' IDENTIFIED BY 'password';

这些工作和我可以创建用户和数据库就好了。然后尝试在新数据库上为新用户分配权限,我得到以下结果:

GRANT ALL PRIVILEGES ON `my_prefix_test`.* TO 'test'@'localhost';

> ERROR 1044 (42000): Access denied for user 'creator'@'localhost' to database 'my_prefix_test'

我也为了安全而冲洗特权。

有没有人对此问题有任何见解?使用存储过程更容易实现吗?谢谢!

1 个答案:

答案 0 :(得分:5)

根据the MySQL GRANT documentation,通配符_%需要反斜杠转义才能在数据库名称中用作文字。在您尝试使用顶部时,您已将_转义为\_而不是另一个GRANT。如果你确实逃脱了两个下划线,你可以获得正确的拨款。但问题是,在向creator用户test用户-- As root: GRANT CREATE USER, CREATE ON *.* TO 'creator'@'localhost' IDENTIFIED BY 'password'; -- Escape both underscores here GRANT ALL PRIVILEGES ON `my\_prefix\_%`.* TO 'creator'@'localhost' WITH GRANT OPTION; 语句发出creator语句时,您必须转义它们:

以root身份登录(或完全特权的用户):

CREATE DATABASE IF NOT EXISTS `my_prefix_test`;
Query OK, 1 row affected (0.00 sec)
CREATE USER 'test'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

-- Issue the GRANT but escape the underscores.
-- because creator@localhost does not have permission to grant on 
-- a pattern like myXprefixXtest, as the unescaped _ wildcards would allow
GRANT ALL PRIVILEGES ON `my\_prefix\_test`.* TO 'test'@'localhost';
Query OK, 0 rows affected (0.00 sec)

test登录:

USE my_prefix_test;
CREATE TABLE t (id INT);
Query OK, 0 rows affected (0.00 sec)

以[{1}}登录,资助有效:

{{1}}