MySQL8新特性-Roles

12月 27th, 2017

一个MySQL的角色是一些权限的集合。就像一个帐号一样,可以对他进行权限的赋权和收回。
我们可以把角色授权给用户,这样帐号就拥用了角色的权限。我们可以同一个角色赋权给不同的帐号,也可以把不同的角色给同一个帐号。

CREATE ROLE and DROP ROLE enable roles to be created and removed.
GRANT and REVOKE enable privilege assignment and revocation for user accounts and roles.
SHOW GRANTS displays privilege and role assignments for user accounts and roles.
SET DEFAULT ROLE specifies which account roles are active by default.
SET ROLE changes the active roles within the current session.
The CURRENT_ROLE() function displays the active roles within the current session.
The mandatory_roles and activate_all_roles_on_login system variables enable defining mandatory roles and automatic activation of granted roles when users log in to the server.

创建一个角色:
CREATE ROLE ‘app_developer’;
给角色赋权:
GRANT ALL ON test.* TO ‘app_developer’;
把角色的权限赋给用户:
如果以前我们可以直接使用GRANT ALL ON test.* TO ‘dev1’@’localhost’ IDENTIFIED BY ‘dev1pass’;来同时建用户并赋权,但是现在我们使用下面的命令将会报错
GRANT app_developer TO ‘dev1’@’localhost’ IDENTIFIED BY ‘dev1pass’;
我们只能分开来操作:
create user ‘dev1’@’localhost’ IDENTIFIED BY ‘dev1pass’;
GRANT app_developer TO ‘dev1’@’localhost’;

这个时候mysql的role_edges表里就会多一条记录
root@mysql 03:44:38>select * from role_edges;
+———–+—————+———–+———+——————-+
| FROM_HOST | FROM_USER | TO_HOST | TO_USER | WITH_ADMIN_OPTION |
+———–+—————+———–+———+——————-+
| % | app_developer | localhost | dev1 | N |
+———–+—————+———–+———+——————-+
1 row in set (0.00 sec)

我们和以前的版本一样来查看一下用户的权限:
root@mysql 03:45:42>show grants for ‘dev1’@’localhost’;
+————————————————-+
| Grants for dev1@localhost |
+————————————————-+
| GRANT USAGE ON *.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+————————————————-+
2 rows in set (0.00 sec)

root@mysql 03:45:53>show grants for ‘dev1’@’localhost’ using ‘app_developer’;
+——————————————————–+
| Grants for dev1@localhost |
+——————————————————–+
| GRANT USAGE ON *.* TO `dev1`@`localhost` |
| GRANT ALL PRIVILEGES ON `test`.* TO `dev1`@`localhost` |
| GRANT `app_developer`@`%` TO `dev1`@`localhost` |
+——————————————————–+
3 rows in set (0.00 sec)

这个时候我们使用dev1刚刚建的用户登一下
$mysql -udev1 -pdev1pass

dev1@(none) 04:02:33>show databases;
+——————–+
| Database |
+——————–+
| information_schema |
+——————–+
1 row in set (0.01 sec)

dev1@(none) 04:02:39>SELECT CURRENT_ROLE();
+—————-+
| CURRENT_ROLE() |
+—————-+
| NONE |
+—————-+
1 row in set (0.00 sec)

dev1@(none) 04:02:54>select * from test.a;
ERROR 1142 (42000): SELECT command denied to user ‘dev1’@’localhost’ for table ‘a’

可以发现并查不了。
这个时候我们set一下当前的角色
dev1@(none) 04:04:33>set role app_developer;
Query OK, 0 rows affected (0.00 sec)

dev1@(none) 04:04:38>SELECT CURRENT_ROLE();
+———————+
| CURRENT_ROLE() |
+———————+
| `app_developer`@`%` |
+———————+
1 row in set (0.00 sec)

dev1@(none) 04:04:42>show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| test |
+——————–+
2 rows in set (0.00 sec)

当我们set了以后可以了。
当然我们也可以SET ROLE ALL 【EXCEPT xxx】 当有多个的时候也可以这个样子
我们每次都需要这样set太累了,我们也可以直接set default
root@mysql 04:30:18>SET DEFAULT ROLE app_developer TO ‘dev1’@’localhost’;
Query OK, 0 rows affected (0.00 sec)

root@mysql 04:30:19>select * from default_roles;
+———–+——+——————-+——————-+
| HOST | USER | DEFAULT_ROLE_HOST | DEFAULT_ROLE_USER |
+———–+——+——————-+——————-+
| localhost | dev1 | % | app_developer |
+———–+——+——————-+——————-+
1 row in set (0.00 sec)

 

收回权限的时候可以使用
REVOKE role FROM user;
REVOKE privileges FROM role;

和role相关的系统参数
dba@(none) 04:50:44>show variables like ‘%role%’;
+—————————–+——-+
| Variable_name | Value |
+—————————–+——-+
| activate_all_roles_on_login | OFF |
| mandatory_roles | |
+—————————–+——-+
2 rows in set (0.00 sec)

dba@(none) 04:52:05>set global activate_all_roles_on_login=on;

https://dev.mysql.com/doc/refman/8.0/en/roles.html

标签:
目前还没有任何评论.