2014-12-06 171 views
3

我试图让我的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' 

我也刷新权限是安全的。

没有人有任何洞察问题?使用存储过程可以更轻松地完成这项工作吗?谢谢!

+0

有趣的是,这似乎为我工作,但它不应该。因为像你所说的那样,下划线作为字面意味着一个字符的通配符。我不知道这是否可能是MySQL的错误? – Ahorner 2014-12-06 19:06:58

+1

不知道这是否是一个错误。 '_'显然是作为通配符工作的,因为我可以创建数据库'my_prefixxtest'并相应地授予它。尽管如此,我无法通过反斜杠转义'_'。 – 2014-12-06 19:11:29

+0

我能够创建'myotherdb'的数据库,并尝试授予'test'用户的所有权限给它,但不成功(这就是我所要做的)。我认为这应该足够好,谢谢!如果你发布一个,我会很乐意接受你的答案。 – Ahorner 2014-12-06 19:14:02

回答

4

根据the MySQL GRANT documentation,通配符_%需要反斜线转义以用作数据库名称中的文字。在您尝试登顶时,您已经跳出了一个_作为\_,但没有其他人。如果你确实逃避了两个下划线,你可以获得正确的授权。诀窍不过,是你必须后发出GRANT语句时为creator用户对test用户转义:

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

-- 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

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 [email protected] 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

迈克尔,你真了不起。我认为我真正需要的是摆脱第二笔赠款中的下划线(作为创造者)。非常感谢您的参与! – Ahorner 2014-12-06 19:17:59