MySQL 角色(role)功能介绍

前言:

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

1. role 简介

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

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

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

# 创建role
mysql> create role 'dev_role';
Query OK, 0 rows affected (0.15 sec)

# 给role授予权限
mysql> grant select on db1.* to 'dev_role'@'%';
Query OK, 0 rows affected (0.12 sec)

# 查看role的权限
mysql> show grants for 'dev_role'@'%';
+-------------------------------------------+
| Grants for dev_role@%                     |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `dev_role`@`%`      |
| GRANT SELECT ON `db1`.* TO `dev_role`@`%` |
+-------------------------------------------+

# 创建用户 并赋予角色权限
mysql> create user 'dev1'@'%' identified by '123456';
Query OK, 0 rows affected (0.68 sec)

mysql> grant 'dev_role' to 'dev1'@'%';
Query OK, 0 rows affected (0.38 sec)

# 查看用户权限
mysql> show grants for 'dev1'@'%';
+------------------------------------+
| Grants for dev1@%                  |
+------------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`%`   |
| GRANT `dev_role`@`%` TO `dev1`@`%` |
+------------------------------------+
2 rows in set (0.63 sec)

# 使用dev1用户登录
root@localhost ~]# mysql -udev1 -p123456

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.34 sec)

mysql> select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.59 sec)

什么情况?貌似和我们想象不同,赋予用户某个角色权限后,该用户并没有获得相应权限。

出现上述情况的原因是,在用户会话中,授予该用户的角色处于非活动状态。只有授予的角色在会话中处于活动状态时,该用户才拥有此角色的权限,要确定当前会话中哪些角色处于活动状态,可以使用 CURRENT_ROLE() 函数。

# 使用 set default role 命令激活角色
mysql> SET DEFAULT ROLE ALL TO dev1;
Query OK, 0 rows affected (0.77 sec)

# 重新登录 发现权限正常
root@localhost ~]# mysql -udev1 -p123456

mysql> select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `dev_role`@`%` |
+----------------+
1 row in set (0.57 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
+--------------------+
2 rows in set (1.05 sec)

除了使用 set default role 命令激活角色外,还可以修改系统变量 activate_all_roles_on_login ,该变量决定是否自动激活 role ,默认为 OFF 即不自动激活,建议将该变量改为 ON ,这样以后赋予角色给新用户后就不需要再手动激活了。

# 查看 activate_all_roles_on_login 变量
mysql> show variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF   |
+-----------------------------+-------+
1 row in set (1.53 sec)

# 启用该变量 先动态启用 之后可以将此参数加入my.cnf配置文件中
mysql> set global activate_all_roles_on_login = on;
Query OK, 0 rows affected (0.50 sec)

# 之后角色就会自动激活
mysql> create user 'dev2'@'%' identified by '123456';
Query OK, 0 rows affected (0.68 sec)

mysql> grant 'dev_role' to 'dev2'@'%';
Query OK, 0 rows affected (0.38 sec)

root@localhost ~]# mysql -udev2 -p123456

mysql> select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `dev_role`@`%` |
+----------------+
1 row in set (0.57 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
+--------------------+
2 rows in set (1.05 sec)

2. role 相关操作

上面我们介绍了创建角色及给用户授予角色权限,关于 role 相关操作还有很多,我们接着来看下。

# 变更角色权限
mysql> grant select on db2.* to 'dev_role'@'%';
Query OK, 0 rows affected (0.33 sec)

# 拥有该角色的用户 重新登录后权限也会对应变化
root@localhost ~]# mysql -udev1 -p123456

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
+--------------------+
3 rows in set (2.01 sec)

# 回收角色权限
mysql> revoke SELECT ON db2.* from 'dev_role'@'%';
Query OK, 0 rows affected (0.31 sec)

# 撤销用户的角色
mysql> revoke 'dev_role'@'%' from 'dev1'@'%';
Query OK, 0 rows affected (0.72 sec)

mysql> show grants for 'dev1'@'%';
+----------------------------------+
| Grants for dev1@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO `dev1`@`%` |
+----------------------------------+
1 row in set (1.06 sec)

# 删除角色 (删除角色后 对应的用户也会失去该角色的权限)
mysql> drop role dev_role;
Query OK, 0 rows affected (0.89 sec)

我们还可以通过 mandatory_roles 变量来配置强制性角色。使用强制性角色,服务器会为全部的用户户默认赋予该角色,而不需要显示执行授予角色。可以使用 my.cnf 文件或者使用 SET PERSIST 进行配置,例如:

# my.cnf 配置
[mysqld]
mandatory_roles='dev_role'

# set 更改变量
SET PERSIST mandatory_roles = 'dev_role';

需要注意的是,配置在 mandatory_roles 中的角色不能撤销其权限,也不能删除。

总结:

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

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

以上就是MySQL 角色(role)功能介绍的详细内容,更多关于MySQL 角色(role)功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解MySQL8的新特性ROLE

    [MySQL的ROLE解决了什么问题] 假设你是一个职业素养良好的DBA比较同时又比较注重权限管理的话:可能遇到过这样的问题,数据库中有多个开发人员的账号:有一天要建 一个新的schema,如果你希望之前所有的账号都能操作这个schema下的表的话,在mysql-8.0之前你要对第一个账号都单独的赋一次权. mysql-8.0.x所权限抽象了出来用ROLE来表示,当你为ROLE增加新的权限的时候,与这个ROLE关联的所有用户的权限也就一并变化了:针对 上面提到的场景在mysql-8.0.x下只要

  • MySQL 8.0用户和角色管理原理与用法详解

    本文实例讲述了MySQL 8.0用户和角色管理.分享给大家供大家参考,具体如下: MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理, 默认的密码加密方式也做了调整,由之前的sha1改为了sha2,同时加上5.7的禁用用户和用户过期的设置, 这样方面用户的管理和权限的管理,也增加了用户的安全性. MySQL8.0中,MySQL库中表的文件合并到数据根目录中的mysql.ibd中(MySQL8.0 Innodb引擎重构). 同时MySQL8.0可以使用SET PERSIST动态修改参

  • MySQL 角色(role)功能介绍

    前言: 上篇文章,我们介绍了 MySQL 权限管理相关知识.当数据库实例中存在大量的库或用户时,权限管理将会变得越来越繁琐,可能要频繁进行权限变更.MySQL 8.0 新增了 role 功能,使得权限管理更加方便,本篇文章我们来看下 8.0 下的 role 功能. 1. role 简介 role 角色功能对于 Oracle 数据库来说不算是什么特殊,在 Oracle 中经常被用到.MySQL 8.0 版本终于新增了 role 功能,为数据库用户权限管理提供了一种新思路. role 可以看做一个权

  • MySQL数据库分区功能的使用教程

    零,什么是数据库分区 来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的.如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条

  • python使用Flask操作mysql实现登录功能

    用到的一些知识点:Flask-SQLAlchemy.Flask-Login.Flask-WTF.PyMySQL 这里通过一个完整的登录实例来介绍,程序已经成功运行,在未登录时拦截了success.html页面跳转到登录页面,登录成功后才能访问success. 以下是项目的整体结构图: 首先是配置信息,配置了数据库连接等基本的信息,config.py DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymy

  • ThinkPHP框架实现的MySQL数据库备份功能示例

    本文实例讲述了ThinkPHP框架实现的MySQL数据库备份功能.分享给大家供大家参考,具体如下: 1.缘由 自从2010年开始试用ThinkPHP以来,的确带来了许多方便.的确给我带来了许多方便.此次应为数据频繁备份需要,而每次远程连接到服务器颇为不便.变萌生了写个ThinkPHP数据库备份SQL生成类的念头. 2.介绍 由于在数据库中有使用触发器.因此也需要一并备份.并且为了插入数据的时候不会受到触发器影响而破坏先前插入的数据,在插入数据之前生成了删除触发器的代码. 本类并不能生成数据表的创

  • ThinkPHP5+jQuery+MySql实现投票功能

    ThinkPHP5+jQuery+MySql实现投票功能,先给大家展示下效果图,如果大家感觉效果不错,请参考实例代码. 效果图: 前端代码: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>基于THINKPHP5实现红蓝投票功能</title> <style type="text/css"> .vote{widt

  • MySQL MHA 运行状态监控介绍

    目录 一 项目描述 1.1 背景 1.2 实现设计 1.2.1 之前的方法 1.2.2 优化后的方法 二.实现详情 2.1 编辑Python可执行文件 2.2 修改 telegraf 文件 2.3 修改telegraf service的运行账号 2.4 启动Telegraf 服务 2.5 配置Grafana,增加Panel 三 .实现 一 项目描述 1.1 背景 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating mas

  • MySQL使用Partition功能实现水平分区

    1 回顾 上一节我们详细讲解了如何对数据库进行分区操作,包括了 垂直拆分(Scale Up 纵向扩展)和水平拆分(Scale Out 横向扩展) ,同时简要整理了水平分区的几种策略,现在来回顾一下. 2 水平分区的5种策略 2.1 Hash(哈希) 这种策略是通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区.例如我们可以建立一个对表的日期的年份进行分区的策略,这样每个年份都会被聚集在一个区间. PARTITION BY HASH(YEAR(c

  • SQLite与MySQL区别及优缺点介绍

    简单来说,SQLITE功能简约,小型化,追求最大磁盘效率:MYSQL功能全面,综合化,追求最大并发效率.如果只是单机上用的,数据量不是很大,需要方便移植或者需要频繁读/写磁盘文件的话,就用SQLite比较合适:如果是要满足多用户同时访问,或者是网站访问量比较大是使用MYSQL比较合适. 下面详细介绍两者的区别和应用: SQLite SQLite是非凡的数据库,他可以进程在使用它的应用中.作为一个自包含.基于文件的数据库,SQLite提供了出色的工具集,可以处理所有类型的数据,没有什么限制,而且比

  • openstack云计算cinder架构及各组件功能介绍

    目录 一 cinder各组件 1.cinder主要组成: 2.cinder各组件功能: 3.nova与cinder的工作原理类似 二 cinder架构图 三 RPC机制 AMQP 模型有四个重要的角色: AMQP消息模型 RPC 发送请求 一 cinder各组件 1.cinder主要组成: #cinder-api #cinder-scheduler #cinder-volume 2.cinder各组件功能: Cinder-api 是 cinder 服务的 endpoint,提供 rest 接口,

  • MySQL使用Partition功能实现水平分区的策略

    目录 1 回顾 2 水平分区的5种策略 2.1 .Hash(哈希) 2.2. Range(范围)  2.3.Key(键值) 2.4.List(预定义列表) 2.5.Composite(复合模式) 3 测试Range策略 3.1 建立总表与分表 3.1.1 总表语句 3.1.2 分表语句 3.2 初始化表数据 3.3 同步数据至完整表中 3.4 测试执行SQL的效率 3.5 使用Explain执行计划分析 3.6 建索引提效 3.7 跨区执行效率分析 3.8 总结 4 分区策略详解 4.1 .HA

随机推荐