乐趣区

关于mysql8:新特性解读-部分权限回收功能的说明

作者:姚远

MySQL ACE,华为云 MVP,专一于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6,5.7,8.0 OCP。当初鼎甲科技任技术顾问,为共事和客户提供数据库培训和技术支持服务。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。

背景

MySQL 数据库对于对象的操作级别分为:全局、数据库、表、字段等。粒度从粗到细。如果粗的粒度的权限满足了,将不再测验细粒度的级别,这种验证形式有的时候不不便,例如须要把 100 个数据库中除了某一个数据库外的拜访权限赋予某个用户,须要进行 99 次赋权。

从 MySQL 8.0.16 开始,MySQL 推出了一种局部权限回收(Partial Revokes)的性能,能够将粗粒度赋予的权限在细粒度上回收。

试验

要应用这个性能须要将零碎参数 partial_revokes 设置成 on,这个参数默认是 off,即默认不容许应用局部权限回收性能,在应用时会遇到上面的谬误:

mysql> revoke select on mysql.* from scutech;
ERROR 1141 (42000): There is no such grant defined for user 'scutech' on host '%'

能够应用上面的命令将这个参数关上:

mysql> SET PERSIST partial_revokes = ON;
Query OK, 0 rows affected (0.00 sec)

上面的命令赋予用户 scutech 对除了 mysql 之外的所有数据库和上面的表的 select 权限:

mysql> grant select on *.* to scutech;
Query OK, 0 rows affected (0.04 sec)

mysql> revoke select on mysql.* from scutech;
Query OK, 0 rows affected (0.00 sec)

赋权实现后能够应用 show grants 命令进行查看:

mysql> show grants for scutech;
+-----------------------------------------------+
| Grants for scutech@%                          |
+-----------------------------------------------+
| GRANT SELECT ON *.* TO `scutech`@`%`          |
| REVOKE SELECT ON `mysql`.* FROM `scutech`@`%` |
+-----------------------------------------------+
2 rows in set (0.00 sec)

赋权实现后在 mysql.user 表外面的 User_attributes 会有 Restrictions 的属性:

mysql> select  User_attributes from mysql.user where user='scutech' and host='%';
+---------------------------------------------------------------------+
| User_attributes                                                     |
+---------------------------------------------------------------------+
| {"Restrictions": [{"Database": "mysql", "Privileges": ["SELECT"]}]} |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

回收局部权限回收性能能够再次赋予局部权限,例如:

mysql> grant SELECT ON `mysql`.* to scutech;
Query OK, 0 rows affected (0.01 sec)


mysql> show grants for scutech;
+--------------------------------------+
| Grants for scutech@%                 |
+--------------------------------------+
| GRANT SELECT ON *.* TO `scutech`@`%` |
+--------------------------------------+
1 row in set (0.00 sec)

也能够从粗粒度上回收权限,这样细粒度的回收当然没有必要存在了,例如:

mysql>  revoke  SELECT ON *.* from scutech;
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for scutech;
+-------------------------------------+
| Grants for scutech@%                |
+-------------------------------------+
| GRANT USAGE ON *.* TO `scutech`@`%` |
+-------------------------------------+
1 row in set (0.00 sec)

阐明:USAGE 这个权限等于什么权限也没有。

退出移动版