前言:我们介绍了MySQL权限管理的相关知识。当数据库实例中有大量库或用户时,权限管理会变得越来越繁琐,可能需要频繁更改权限。MySQL8.0增加了角色功能,权限管理更方便。本篇我们就来看看8.0下的角色功能。一、角色介绍角色功能对于Oracle数据库来说并没有什么特别之处,在Oracle中经常会用到。MySQL8.0终于加入了角色功能,为数据库用户权限管理提供了新的思路。角色可以看作是一个权限的集合,这个集合有一个统一的名字角色名。可以为多个数据库用户授予同一个角色的权限,通过修改角色直接更改权限,无需每个用户一一更改,方便运维和管理。角色可以创建、删除、修改和操作它管理的用户。下面详细体验角色功能:#createrolemysql>createrole'dev_role';QueryOK,0rowsaffected(0.15sec)#Grantpermissiontorolemysql>grantselectondb1.*to'dev_role'@'%';QueryOK,0rowsaffected(0.12sec)#查看角色权限mysql>showgrantsfor'dev_role'@'%';+---------------------------------------------+|Grantsfordev_role@%|+-------------------------------------------+|GRANTUSAGEON*.*TO`dev_role`@`%`||GRANTSELECTON`db1`.*TO`dev_role`@`%`|+-----------------------------------------+#创建用户并授予角色权限mysql>createuser'dev1'@'%'identifiedby'123456';QueryOK,0rowsaffected(0.68sec)mysql>grant'dev_role'to'dev1'@'%';QueryOK,0rowsaffected(0.38sec)#查看用户权限mysql>showgrantsfor'dev1'@'%';+------------------------------------+|Grantsfordev1@%|+-----------------------------------+|GRANTUSAGEON*.*TO`dev1`@`%`||授予`dev_role`@`%`TO`dev1`@`%`|+------------------------------------+2rowsinset(0.63sec)#使用dev1用户登录root@localhost~]#mysql-udev1-p123456mysql>showdatabases;+--------------------+|数据库|+------------------+|information_schema|+--------------------+1rowinset(0.34sec)mysql>selectCURRENT_ROLE();+----------------+|CURRENT_ROLE()|+----------------+|NONE|+----------------+1rowinset(0.59sec)是什么情况?好像和我们想象的不一样。授予用户某个角色权限后,该用户并没有获得相应的权限。出现这种情况的原因是授予用户的角色在用户会话中未激活。仅当授予的角色在会话中处于活动状态时,用户才具有角色权限。要确定哪些角色在当前会话中处于活动状态,请使用CURRENT_ROLE()函数。#使用setdefaultrole命令激活角色mysql>SETDEFAULTROLEALLTOdev1;QueryOK,0rowsaffected(0.77sec)#重新登录发现权限正常root@localhost~]#mysql-udev1-p123456mysql>selectCURRENT_ROLE();+--------------+|CURRENT_ROLE()|+----------------+|`dev_role`@`%`|+----------------+1rowinset(0.57sec)mysql>showdatabases;+--------------------+|数据库|+-----------------+|db1||information_schema|+-----------------+2rowsinset(1.05sec)除了使用setdefaultrole命令激活角色外,还可以修改系统变量activate_all_roles_on_login。该变量决定是否自动激活角色。默认为OFF,即不会自动激活。建议将此变量更改为ON,这样您以后就不需要手动为新用户分配角色。活性。#查看activate_all_roles_on_login变量mysql>showvariableslike'activate_all_roles_on_login';+----------------------------+-------+|Variable_name|Value|+------------------------+------+|activate_all_roles_on_login|OFF|+---------------------------+--------+1rowinset(1.53sec)#先动态启用这个变量之后,my.cnf配置文件中可以加上这个参数mysql>setglobalactivate_all_roles_on_login=on;QueryOK,0rowsaffected(0.50sec)#那么角色会自动激活mysql>createuser'dev2'@'%'identifiedby'123456';QueryOK,0rowsaffected(0.68sec)mysql>grant'dev_role'to'dev2'@'%';QueryOK,0rowsaffected(0.38sec)root@localhost~]#mysql-udev2-p123456mysql>selectCURRENT_ROLE();+---------------+|CURRENT_ROLE()|+--------------+|`dev_role`@`%`|+---------------+1rowinset(0.57sec)mysql>showdatabases;+----------------+|数据库|+-------------------+|db1||information_schema|+----------------+2rowsinset(1.05sec)2。角色相关操作上面我们介绍了创建角色和给用户授予角色权限。角色相关的操作还有很多,接下来我们再看。#更改角色权限mysql>grantselectondb2.*to'dev_role'@'%';QueryOK,0rowsaffected(0.33sec)#拥有该角色的用户再次登录后也会更改权限root@localhost~]#mysql-udev1-p123456mysql>showdatabases;+--------------------+|数据库|+--------------------+|db1||db2||information_schema|+--------------------+3rowsinset(2.01sec)#回收角色权限mysql>revokeSELECTONdb2.*from'dev_role'@'%';QueryOK,0rowsaffected(0.31sec)#revoketheuser'srolemysql>revoke'dev_role'@'%'from'dev1'@'%';QueryOK,0rowsaffected(0.72sec)mysql>showgrantsfor'dev1'@'%';+--------------------------------+|Grantsfordev1@%|+---------------------------------+|GRANTUSAGEON*.*TO`dev1`@`%`|+---------------------------------+1rowinset(1.06sec)#删除角色(删除角色后对应的用户也会丢失rolepermissions)mysql>droproledev_role;QueryOK,0rowsaffected(0.89sec)我们也可以通过mandatory_roles变量配置强制角色。对于强制角色,服务器默认将角色授予所有用户,而无需显式强制角色。可以使用my.cnf文件或者使用SETPERSIST来配置,例如:#my.cnf配置[mysqld]mandatory_roles='dev_role'#setchangevariableSETPERSISTmandatory_roles='dev_role';需要注意的是,在mandatory_roles中配置的角色不能撤销其权限,也不能被删除。总结:关于角色相关的知识,简单总结如下几点:角色是权限的集合,可以授予不同的权限。启用activate_all_roles_on_login变量以自动激活角色。一个用户可以有多个角色,一个角色也可以授予多个用户。角色权限的更改将应用??于相应的用户。如果一个角色被删除,拥有该角色的用户也将失去该角色的权限。可以设置强制角色,让所有用户都拥有该角色的权限。角色管理类似于用户管理,只是不能使用角色登录数据库。
