MySQL 8.0.18 все привилегии для базы данных для роли не позволяют пользователю создавать базу данных - PullRequest
1 голос
/ 09 марта 2020

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

1 Ответ

0 голосов
/ 10 марта 2020

Роль с теми же привилегиями, что и у пользователя, при назначении пользователю не позволяет ему создавать базу данных. Этого не происходит с глобальными привилегиями (*.*) для пользователя или роли, а также с привилегиями SELECT для базы данных. Только CREATE привилегии демонстрируют такое поведение. Согласно этой теме это ожидаемое поведение.

...