Я использую роли для предоставления грантов моим 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 8.0 .18 изображение .