MySQL · 社区动态 · MariaDB Role 体系

简介: 背景 从 MairaDB 10.0.5 开始,MariaDB 开始提供 Role(角色)的功能,补全了大家一直吐槽的 MySQL 不能像 Oracle 一样支持角色定义的功能。 一个角色就是把一堆的权限捆绑在一起授权,这个功能对于有很多用户拥有相同权限的情况可以显著提高管理效率。在有角色之前,这

背景

从 MairaDB 10.0.5 开始,MariaDB 开始提供 Role(角色)的功能,补全了大家一直吐槽的 MySQL 不能像 Oracle 一样支持角色定义的功能。

一个角色就是把一堆的权限捆绑在一起授权,这个功能对于有很多用户拥有相同权限的情况可以显著提高管理效率。在有角色之前,这种情况只能为每个用户都做一大堆的授权操作,或者是给很多个需要相同权限的用户提供同一个账号去使用,这又会导致你要分析用户行为的时候不知道哪个操作是哪个具体用户发起的。

有了角色,这样的管理就太容易了。例如,可以把权限需求相同的用户赋予同一个角色,只要定义好这个角色的权限就行,要更改这类用户的权限,只需要更改这个角色的权限就可以了,变化会影响到所有这个角色的用户。

用法

创建角色需要使用 CREATE ROLE 语句,删除角色使用 DROP ROLE 语句。然后再通过 GRANT 语句给角色增加授权,也可以把角色授权给用户,然后这个角色的权限就会分配给这个用户。同样,REVOKE 语句也可以用来移除角色的授权,或者把一个用户移除某个角色。

一旦用户连接上来,他可以执行 SET ROLE 语句来把自己切换到某个被授权的角色下,从而使用这个角色的权限。通过 CURRENT_ROLE 函数可以显示当前用户执行在哪个角色下,没有就是 NULL。

只有直接被授予用户的角色才可以使用 SET ROLE 语句,间接授予的角色并不能被 SET ROLE 设置。例如角色B被授予角色A,而角色A被授予用户A,那么用户A只能 SET ROLE 角色A,而不能设置角色B。

从 MariaDB 10.1.1 开始,可以利用 SET DEFAULT ROLE 语句来给某个用户设置默认的角色。当用户链接的时候,会默认使用这个角色,其实就是连接后自动做了一个 SET ROLE 语句。

使用举例

创建一个角色并给他赋权:

CREATE ROLE journalist;
GRANT SHOW DATABASES ON *.* TO journalist;
GRANT journalist to hulda;

这里 hulda 并不马上拥有 SHOW DATABASES 权限,他还需要先执行一个 SET ROLE 语句启用这个角色:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| NULL         |
+--------------+
SET ROLE journalist;
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| journalist   |
+--------------+
SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| ...                |
| information_schema |
| mysql              |
| performance_schema |
| test               |
| ...                |
+--------------------+
SET ROLE NONE;

角色也可以授权给另一个角色:

CREATE ROLE writer;
GRANT SELECT ON data.* TO writer;
GRANT writer TO journalist;

但是只能 SET ROLE 直接给用户的角色。像这里 hulda 只能 SET ROLE journalist,而不能 SET ROLE writer,并且只要启用了 journalist 角色,hulda 也自动获得了 writer 角色的权限:

SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| NULL         |
+--------------+
SHOW TABLES FROM data;
Empty set (0.01 sec)

SET ROLE journalist;
SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| journalist   |
+--------------+
SHOW TABLES FROM data;
+------------------------------+
| Tables_in_data               |
+------------------------------+
| set1                         |
| ...                          |
+------------------------------+

角色和视图、存储过程。

当用户设置启用了一个角色,从某种意义上说他有两个身份的权限集合(用户本身和他的角色)但是一个视图或者存储过程只能有一个定义者。所以,当一个视图或者存储过程通过 SQL SECURITY DEFINER 创建时,只能指定 CURRENT_USER 或者 CURRENT_ROLE 中的一个。所以有些情况下,你创建了一个视图,但是你却可能没法使用它。

CREATE ROLE r1;
GRANT ALL ON db1.* TO r1;
GRANT r1 TO foo@localhost;
GRANT ALL ON db.* TO foo@localhost;
SELECT CURRENT_USER
+---------------+
| current_user  |
+---------------+
| foo@localhost |
+---------------+
SET ROLE r1;
CREATE TABLE db1.t1 (i int);
CREATE VIEW db.v1 AS SELECT * FROM db1.t1;
SHOW CREATE VIEW db.v1;
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                              | character_set_client | collation_connection |
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v1   | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost` SQL SECURITY DEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i` AS `i` from `db1`.`t1` | utf8                 | utf8_general_ci      |
+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
CREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM db1.t1;
SHOW CREATE VIEW db.b2;
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                 | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v2   | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY DEFINER VIEW `db`.`v2` AS select `db1`.`t1`.`a` AS `a` from `db1`.`t1` | utf8                 | utf8_general_ci      |
+------+---------------------------------------------------------------------------------------
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
808 152
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
471 8
|
SQL 关系型数据库 MySQL
如何在 MySQL 或 MariaDB 中导入和导出数据库
如何在 MySQL 或 MariaDB 中导入和导出数据库
1165 0
|
SQL Ubuntu 关系型数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
如何在云服务器上创建和管理 MySQL 和 MariaDB 数据库
247 0
|
关系型数据库 MySQL 数据库连接
FreeSWITCH通过mod_mariadb原生连接MySQL
FreeSWITCH通过mod_mariadb原生连接MySQL
1088 0
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
165 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多