​MySQL8.0角色管理—(三)

  • 2020 年 2 月 25 日
  • 筆記

//

MySQL8.0角色管理—(三)

//

之前写了两篇关于MySQL8.0的角色管理的文章,今天接着来看这个特性。

01

撤销角色,回收角色权限

类似将角色授予账户一样,我们可以使用revoke的方法从账户中撤销角色,下面我们演示从账号yeyz_ro中撤销角色role_ro角色:

mysql> show grants for yeyz_ro@'%' using 'role_ro';  +----------------------------------------------+  | Grants for yeyz_ro@%                         |  +----------------------------------------------+  | GRANT SHOW DATABASES ON *.* TO `yeyz_ro`@`%` |  | GRANT SELECT ON `yeyz`.* TO `yeyz_ro`@`%`    |  | GRANT `role_ro`@`%` TO `yeyz_ro`@`%`         |  +----------------------------------------------+  3 rows in set (0.00 sec)    mysql> revoke 'role_ro' from yeyz_ro@'%';  Query OK, 0 rows affected (0.03 sec)    mysql> show grants for yeyz_ro@'%' using 'role_ro';  ERROR 3530 (HY000): `role_ro`@`%` is not granted to `yeyz_ro`@`%`  mysql> show grants for yeyz_ro@'%';  +-------------------------------------+  | Grants for yeyz_ro@%                |  +-------------------------------------+  | GRANT USAGE ON *.* TO `yeyz_ro`@`%` |  +-------------------------------------+  1 row in set (0.00 sec)  

我们看到,使用了revoke 的语法回收了yeyz_ro的角色role_ro之后,相应的yeyz_ro账号的权限也变少了。

回收角色权限:

我们可以通过revoke的方法回收一个角色的权限,例如role_rw这个角色的增删改查权限,我们可以回收掉它的删除权限,如下:

mysql> show grants for yeyz_rw@'%' using 'role_rw';  +-------------------------------------------------------------------+  | Grants for yeyz_rw@%                                              |  +-------------------------------------------------------------------+  | GRANT SHOW DATABASES ON *.* TO `yeyz_rw`@`%`                      |  | GRANT SELECT, INSERT, UPDATE, DELETE ON `yeyz`.* TO `yeyz_rw`@`%` |  | GRANT `role_rw`@`%` TO `yeyz_rw`@`%`                              |  +-------------------------------------------------------------------+  3 rows in set (0.00 sec)    mysql> revoke delete on yeyz.* from  role_rw;  Query OK, 0 rows affected (0.01 sec)    mysql> show grants for yeyz_rw@'%' using 'role_rw';  +-----------------------------------------------------------+  | Grants for yeyz_rw@%                                      |  +-----------------------------------------------------------+  | GRANT SHOW DATABASES ON *.* TO `yeyz_rw`@`%`              |  | GRANT SELECT, INSERT, UPDATE ON `yeyz`.* TO `yeyz_rw`@`%` |  | GRANT `role_rw`@`%` TO `yeyz_rw`@`%`                      |  +-----------------------------------------------------------+  3 rows in set (0.00 sec)

可以看到,当我们回收了角色的权限之后,绑定该角色的账号的权限也会相应变少,所以这个操作是联动的。

02

角色和账号的区别

我们知道,我们创建角色,可以给角色赋予一定的权限。我们也可以创建账号,给账号赋予一定的权限。二者都是用来访问数据库的,那么他们之间的区别有哪些呢?

区别1:CREATE ROLE创建角色,它默认情况下是被锁定的权限标识符,而CREATE USER创建账户,默认情况下被解锁的权限标识符。也就是说,CREATE ROLE创建的角色是一种预先进行的操作,一旦我们把它绑定到账户上,后续激活角色即可使用既定账号。

区别2:权限上的差异,如果我们拥有CREATE ROLE和DROP ROLE权限,则我们被允许使用CREATE ROLE和DROP ROLE语句;如果我们拥有CREATE USER权限,则我们被允许使用ALTER USER,CREATE ROLE,CREATE USER,DROP ROLE,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES等语句。

区别3:角色可以绑定到账号上,这意味着我们可以用某一个全局的角色,来对所有账号进行批量管理。

03

账户和角色的互换性

角色可以绑定到用户,当然,MySQL8.0还支持将用户绑定到角色,在一定程度上来讲,账户和角色具有互换性,如下:

#创建一个角色r1,一个账号u1  mysql> create role 'r1'@'%';  Query OK, 0 rows affected (0.01 sec)    mysql> create user 'u1'@'%';  Query OK, 0 rows affected (0.01 sec)  #分别授予select权限,r1有yeyz数据库的权限,u1拥有yeyz2数据库的权限  mysql> grant select on yeyz.* to 'r1'@'%';  Query OK, 0 rows affected (0.01 sec)    mysql> grant select on yeyz2.* to 'u1'@'%';  Query OK, 0 rows affected (0.01 sec)    #--------------将u1和r1互相绑定-----------  mysql> grant 'u1' to 'r1';  Query OK, 0 rows affected (0.01 sec)    mysql> grant 'r1' to 'u1';  Query OK, 0 rows affected (0.00 sec)      #查看二者的权限,发现u1和r1分别拥有了对方的权限。  mysql> show grants for 'u1' using 'r1';  +---------------------------------------+  | Grants for u1@%                       |  +---------------------------------------+  | GRANT USAGE ON *.* TO `u1`@`%`        |  | GRANT SELECT ON `yeyz`.* TO `u1`@`%`  |  | GRANT SELECT ON `yeyz2`.* TO `u1`@`%` |  | GRANT `r1`@`%` TO `u1`@`%`            |  +---------------------------------------+  4 rows in set (0.00 sec)    mysql> show grants for 'r1' using 'u1';  +---------------------------------------+  | Grants for r1@%                       |  +---------------------------------------+  | GRANT USAGE ON *.* TO `r1`@`%`        |  | GRANT SELECT ON `yeyz`.* TO `r1`@`%`  |  | GRANT SELECT ON `yeyz2`.* TO `r1`@`%` |  | GRANT `u1`@`%` TO `r1`@`%`            |  +---------------------------------------+  4 rows in set (0.00 sec)  

在一定程度上,一个激活的角色和一个账号之间可以进行互相替代,只要权限是相同的,我们可以认为用角色去访问数据库和用账号去访问数据库的结果是一样的。因为,角色的本质,就是权限的集合。

角色和账号之间的互换性给我们提供了一个思路,假如某个数据库处于开发阶段,其上有多个账号,某个开发人员的账号权限,完全可以将一个模板开发账号跟该开发人员账号进行绑定,这样,如果要同一管理所有开发人员的账号,只需要修改模板开发账号即可,给快速的管理权限带来了方便。