我试图通过权限尽可能地限制我的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 :(得分: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}}