关于mysql:MySQL角色role功能介绍

3次阅读

共计 4216 个字符,预计需要花费 11 分钟才能阅读完成。

前言:

上篇文章,咱们介绍了 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 变量,才能够主动激活角色。
  • 一个用户能够领有多个角色,一个角色也能够授予多个用户。
  • 角色权限变动会利用到对应用户。
  • 删除角色,则领有此角色的用户也会丢失此角色的权限。
  • 可设置强制性角色,使得所有用户都领有此角色的权限。
  • 角色治理和用户治理类似,只是角色不能用于登录数据库。
正文完
 0