【发布时间】:2020-06-21 05:47:41
【问题描述】:
我使用角色来授予我的 MySQL 用户。我注意到在向用户授予角色时在任何地方都找不到记录的奇怪行为。让我带你了解一下。
首先,我们创建一个实际用户joe@localhost,并授予它在joe_db 上的所有权限。虽然我在代码中省略了第二步,但我在这里用它来说明这种行为是多么出乎意料。 ($ mysql 以 root 身份登录)。
$ mysql
mysql> CREATE USER 'joe'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER USER 'joe'@'localhost' IDENTIFIED BY '1234';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT ALL ON `joe_db`.* TO 'joe'@'localhost';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> exit
Bye
现在,为了消除其他问题,我以 joe@localhost 身份登录并断言我的赠款确实有效。
$ mysql -ujoe -p1234 -hlocalhost
mysql> CREATE DATABASE `joe_db`;
Query OK, 1 row affected (0.01 sec)
mysql> DROP DATABASE `joe_db`;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
现在让我们再次以 root 身份登录并创建一个新角色joe_role。我们为这个角色授予与joe@localhost 相同的权限。然后我们将joe_role 授予joe。
$ mysql
mysql> CREATE ROLE 'joe_role';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL ON `joe_db`.* TO `joe_role`;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT `joe_role` TO `joe`@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
让我们再次以joe 登录并激活joe_role。这样做会阻止我们创建数据库。这种行为是我所质疑的。 这是预期的吗?有没有办法为有权创建joe_db 而无需授予全局权限的用户创建角色?
$ mysql -ujoe -p1234 -hlocalhost
mysql> SET ROLE `joe_role`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE DATABASE `joe_db`;
ERROR 1044 (42000): Access denied for user 'joe'@'localhost' to database 'joe_db'
为了消除其他问题,让我们看看当我们将joe权限设置为全局时会发生什么。
mysql> exit
Bye
$ mysql
mysql> GRANT ALL ON *.* to `joe_role`;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
$ mysql -ujoe -p1234 -hlocalhost
mysql> CREATE DATABASE `joe_db`;
Query OK, 1 row affected (0.01 sec)
它再次工作。撤销该角色也使其再次工作。显然两者都不是解决方案。
总结一下: 我做错了什么,或者我如何误解了正在发生的角色概念?
【问题讨论】:
标签: mysql authorization