MySQL用户也可以是个角色( 五 )

注意:无论是撤销 , 还是删除 , 都不能动 mandatory_roles 系统变量值中的强制角色 。5、用户也可以是个角色没错 , 用户也可以是个角儿 ^_~ , 这是怎么回事儿呢?其实 , 就用户也可以当角色来用的:# 8.0以前的MySQL GRANT语法中 , 用户权限授予到另一个用户上是违法的mysql> select @@version;+------------+| @@version|+------------+| 5.7.26-log |+------------+1 row in set (0.06 sec)mysql> CREATE USER user1, user2;Query OK, 0 rows affected (0.05 sec)mysql> GRANT user1 TO user2;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'user1 TO user2' at line 1# 8.0之后是实现了用户和角色可互换性mysql> select @@version;+-----------+| @@version |+-----------+| 8.0.23|+-----------+1 row in set (0.05 sec)mysql> CREATE USER user1, user2;Query OK, 0 rows affected (0.07 sec)# 给用户[user1]授权mysql> GRANT SELECT ON app_db.* TO user1;Query OK, 0 rows affected (0.06 sec)# 把[user1]的权限授予给[user2] ---> 未报错 , 语法通过的mysql> GRANT user1 TO user2;Query OK, 0 rows affected (0.06 sec)# 查看[user2]的权限 , 可以看到是把[user1]用户作为一个角色来授予mysql> SHOW GTANTS FOR user2;+-----------------------------------+| Grants for user2@%|+-----------------------------------+| GRANT USAGE ON *.* TO `user2`@`%` || GRANT `user1`@`%` TO `user2`@`%`|+-----------------------------------+2 rows in set (0.05 sec)# 查看[user2]的详细权限mysql> SHOW GTANTS FOR user2 USING user1;+-------------------------------------------+| Grants for user2@%|+-------------------------------------------+| GRANT USAGE ON *.* TO `user2`@`%`|| GRANT SELECT ON `app_db`.* TO `user2`@`%` || GRANT `user1`@`%` TO `user2`@`%`|+-------------------------------------------+3 rows in set (0.05 sec)由此可见 , 用户和角色是可以互换使用的 。

  • 角色和用户之间的一个区别是 , CREATE ROLE 创建的授权标识符默认是锁定的(mysql.user 可查看) , 而 CREATE USER 创建的授权标识符默认是解锁的 。但是 , 区别并不是不可变的 , 因为可以在创建角色或用户后锁定或解锁角色或用户 。
  • 权限角度来看 , CREATE USER 是包含了 CREATE ROLE , 也就是说 , CREATE USER 即可以创建用户 , 也可以创建角色 。
总结本文简单介绍了数据库用户和角色的权限管理应用 , 包括 MySQL 8.0 对角色的引入 , 虽然目前生产数据库暂未对角色进行更多的应用 , 当其实现了权限管理的多样化和精细化 , 可以更好地权限分离 , 能够满足某些特殊场景下对权限管理的需求 , 还是很值得期待的 。

经验总结扩展阅读