业务需求:对一个用户回收一个表的所有权限,但是之前对这个用户是授权表所在库的整个权。
背景:某个表后来插入了机密数据,不能再让人随便查阅了。
比如:存在库 test01 库下存在表T1,那mysql是否支持呢,来复盘下整个操作:
首先整库授权:
grant all privilges on test01.* to test0629;
> show grants for test0629;
+-----------------------------------------------------+
| Grants for test0629@% |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO 'test0629'@'%' |
| GRANT ALL PRIVILEGES ON `test01 `.* TO 'test0629'@'%' |
+-----------------------------------------------------+
2 尝试回收 T1权限
revoke ALL PRIVILEGES on `test01 `.T1 from test0629;
ERROR 1147 (42000): There is no such grant defined for user 'test0629' on host '%' on table 'T1'
可以看到无法回收,因为之前没有对此表单独授权过。
3 那再想一想曲线救国呢,先对这个表授权下,再回收是否就搞定了呢,拭目以待:
> grant all privileges on Test01.T1 to test0629;
Query OK, 0 rows affected (0.01 sec)
> show grants for test0629;
+-----------------------------------------------------------------+
| Grants for test0629@% |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test0629'@'%' |
| GRANT ALL PRIVILEGES ON `test01 `.* TO 'test0629'@'%' |
| GRANT ALL PRIVILEGES ON `test01 `.`T1` TO 'test0629'@'%' |
+-----------------------------------------------------------------+
再回收该表的权限:
revoke ALL PRIVILEGES on `test01`.T1 from test0629;
Query OK, 0 rows affected (0.01 sec)
> show grants for test0629;
+-----------------------------------------------------+
| Grants for test0629@% |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO 'test0629'@'%' |
| GRANT ALL PRIVILEGES ON `test01`.* TO 'test0629'@'%' |
回收后再看看是否还有该表访问权限
mysql -hxxxx -Pxxx -utest0629
> show databases;
+--------------------+
| Database |
+--------------------+
| test01 |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)
> use test01
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
[test01]> show tables;
+------------------+
| Tables_in_Test01 |
+------------------+
| T1
+------------------+
1 rows in set (0.00 sec)
> select * from T1;
+----------------+------+---------------------+
| a |b | c |
+----------------+------+---------------------+
| 1 | 2 | 3|
| 4 | 5 | 6 |
+----------------+------+---------------------+
可见:对整库授权是无法回收库下单表权限的,因为
授权和回收的粒度必须一致的,同样的对所有库授权也是不能单独回收一个库的。
因为对所有库授权信息是在mysql.user表里的,该权限表最小粒度是全局权限,不能说去掉一个库,剩余某些库,因为该表没有这个库这字段。
对指定库授权信息是mysql.db表里的,该权限表支持的最小授权单位就是库,如果两个库就会有两条记录,同理,没有表字段。
对表授权信息是在mysql.table表里的,该权限表支持的最小授权单位就是表,同理没有列字段。
同样对列权限也是mysql.columns_priv,该权限表支持的最小授权单位就是列
所以结论是不可行的,曲线救国,虽然回收了表的权限,只是回收了table权限表,db表里还有该权限,所以还是可以访问的,因为权限验证顺序是按照 :
user ->db->table->columns_priv
验证的,db里有就直接验证通过了。
但是最终还是要解决问题的,怎么办:
把原来整库权限回收了,再对库下的其他表授权。
---------虽然笨,但有招胜无招。
————————————————
版权声明:本文为CSDN博主「郭烊千玺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42851042/article/details/118335519
标签:权限,test0629,细枝,T1,mysql,授权,test01 From: https://www.cnblogs.com/blog-cyk/p/17982290