前言:

上篇文章,我们介绍了 MySQL 权限管理相关知识。当数据库实例中存在大量的库或用户时,权限管理将会变得越来越繁琐,可能要频繁进行权限变更。MySQL 8.0 新增了 role 功能,使得权限管理更加方便,本篇文章我们来看下 8.0 下的 role 功能。

1. role 简介

role 角色功能对于 Oracle 数据库来说不算是什么特殊,在 Oracle 中经常被用到。MySQL 8.0 版本终于新增了 role 功能,为数据库用户权限管理提供了一种新思路。

role 可以看做一个权限的集合,这个集合有一个统一的名字 role 名。可以给多个数据库用户授予同个 role 的权限,权限变更可直接通过修改 role 来实现,不需要每个用户一个一个的去变更,方便运维和管理。role 可以创建、删除、修改并作用到它管理的用户上。

下面我们具体来体验下 role 角色功能:

#创建rolemysql>createrole'dev_role';QueryOK,0rowsaffected(0.15sec)#给role授予权限mysql>grantselectondb1.*to'dev_role'@'%';QueryOK,0rowsaffected(0.12sec)#查看role的权限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`@`%`||GRANT`dev_role`@`%`TO`dev1`@`%`|+------------------------------------+2rowsinset(0.63sec)#使用dev1用户登录root@localhost~]#mysql-udev1-p123456mysql>showdatabases;+--------------------+|Database|+--------------------+|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;+--------------------+|Database|+--------------------+|db1||information_schema|+--------------------+2rowsinset(1.05sec)
#查看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;+--------------------+|Database|+--------------------+|db1||information_schema|+--------------------+2rowsinset(1.05sec)
#变更角色权限mysql>grantselectondb2.*to'dev_role'@'%';QueryOK,0rowsaffected(0.33sec)#拥有该角色的用户重新登录后权限也会对应变化root@localhost~]#mysql-udev1-p123456mysql>showdatabases;+--------------------+|Database|+--------------------+|db1||db2||information_schema|+--------------------+3rowsinset(2.01sec)#回收角色权限mysql>revokeSELECTONdb2.*from'dev_role'@'%';QueryOK,0rowsaffected(0.31sec)#撤销用户的角色mysql>revoke'dev_role'@'%'from'dev1'@'%';QueryOK,0rowsaffected(0.72sec)mysql>showgrantsfor'dev1'@'%';+----------------------------------+|Grantsfordev1@%|+----------------------------------+|GRANTUSAGEON*.*TO`dev1`@`%`|+----------------------------------+1rowinset(1.06sec)#删除角色(删除角色后对应的用户也会失去该角色的权限)mysql>droproledev_role;QueryOK,0rowsaffected(0.89sec)
#my.cnf配置[mysqld]mandatory_roles='dev_role'#set更改变量SETPERSISTmandatory_roles='dev_role';

总结:

关于 role 角色相关知识,简单总结几点如下:

  • role 是一个权限的集合,可以被赋予不同权限。
  • 开启 activate_all_roles_on_login 变量,才可以自动激活角色。
  • 一个用户可以拥有多个角色,一个角色也可以授予多个用户。
  • 角色权限变化会应用到对应用户。
  • 删除角色,则拥有此角色的用户也会丧失此角色的权限。
  • 可设置强制性角色,使得所有用户都拥有此角色的权限。
  • 角色管理和用户管理相似,只是角色不能用于登录数据库。

更多相关文章

  1. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  2. android 拨打紧急号码,通话时开启免提功能实现
  3. Android(安卓)下拉刷新,非常强大的下拉刷新功能
  4. Android中判断网络功能是否可用
  5. Android实现下载文件功能的方法
  6. android WebView 图片缩放功能小结
  7. Android实现圆角弹框功能
  8. android版本与linux内核版本对应关系
  9. android表格数据移动功能

随机推荐

  1. android加分割线
  2. Android使用贝塞尔曲线画心形
  3. Android(安卓)解决WebView支持WebGL的兼
  4. Android系列之Android 命令行手动编译打
  5. Android shell命令大全
  6. Android软键盘弹出,界面整体上移的问题
  7. android listview去掉分割线
  8. android在线播放音乐
  9. android读取文件权限
  10. Android游戏引擎《Rokon》