role 角色功能对于 Oracle 数据库来说不算是什么特殊, 然而对于 MySQL 来说 MySQL8.0 新增了 role 角色功能意义还是令人新奇不少, 同时也是很多使用 MySQL 服务的用户一直所期盼的
MySQL8.0 中新增的 role 功能, DBA 可以创建角色, 对其赋予权限, 并且将他们授权用户, 使用角色可以大量减轻 DBA 的工作, 可以轻松管理每个团队, 用户的各种复杂的权限.
下面详细介绍一下 MySQL 中如何使用角色:
一, 创建删除角色:
创建角色使用 "CREATE ROLE" 语句, 假设我们为应用程序创建只读角色, 读写角色和开发人员角色.
- [email protected]:MySQL.sock 20:37: [(none)]>create role 'db_read', 'db_rw', 'db_dev';
- Query OK, 0 rows affected (0.08 sec)
角色的名称与 MySQL 的账户名称非常相似, 由用户名 + 主机名称构成, 如果省略主机名称则默认为'%'.
二, 删除角色使用:
- [email protected]:MySQL.sock 20:39: [(none)]>drop role db_dev;
- Query OK, 0 rows affected (0.08 sec)
三, 赋予 / 撤销权限:
角色创建以后, 需要对其赋予相应的权限. 使用下列语句分别对角色赋予全部权限, 只读权限和读写权限:
全部权限:
- [email protected]:MySQL.sock 20:43: [(none)]>create role 'db_dev';
- Query OK, 0 rows affected (0.03 sec)
- [email protected]:MySQL.sock 20:44: [(none)]>grant all on app_db.* to 'db_dev';
- Query OK, 0 rows affected (0.04 sec)
只读权限:
- [email protected]:MySQL.sock 20:44: [(none)]>grant select on app_db.* to 'db_read';
- Query OK, 0 rows affected (0.08 sec)
读写权限:
- [email protected]:MySQL.sock 20:46: [(none)]>grant select,insert,update,delete on app_db.* to 'db_rw';
- Query OK, 0 rows affected (0.07 sec)
四, 赋予角色权限后, 将相应的角色授予用户
例如:
创建用户:
- [email protected]:MySQL.sock 20:50: [(none)]>create user 'db_dev_user'@'localhost' identified by 'passjw01';
- Query OK, 0 rows affected (0.09 sec)
- [email protected]:MySQL.sock 20:52: [(none)]>create user 'db_read_user'@'localhost' identified by 'passjw02';
- Query OK, 0 rows affected (0.08 sec)
- [email protected]:MySQL.sock 20:52: [(none)]>create user 'db_rw_user'@'localhost' identified by 'passjw03';
- Query OK, 0 rows affected (0.05 sec)
授予角色权限:
- [email protected]:MySQL.sock 20:53: [(none)]>grant 'db_dev' to 'db_dev_user'@'localhost';
- Query OK, 0 rows affected (0.07 sec)
- [email protected]:MySQL.sock 20:54: [(none)]>grant 'db_read' to 'db_read_user'@'localhost';
- Query OK, 0 rows affected (0.02 sec)
- [email protected]:MySQL.sock 20:54: [(none)]>grant 'db_rw' to 'db_rw_user'@'localhost';
- Query OK, 0 rows affected (0.07 sec)
五, 撤销用户的角色和撤销角色的权限:
- [email protected]:MySQL.sock 20:54: [(none)]>revoke 'db_dev' from 'db_dev_user'@'localhost';
- Query OK, 0 rows affected (0.03 sec)
- [email protected]:MySQL.sock 20:55: [(none)]>revoke all on app_db.* from db_dev;
- Query OK, 0 rows affected (0.10 sec)
- [email protected]:MySQL.sock 20:57: [(none)]>
六, 查看角色的权限:
当角色授予用户后, 我们可以查看用户拥有的权限, 执行:
- [email protected]:MySQL.sock 20:59: [(none)]>show grants for 'db_rw_user'@'localhost';
- +------------------------------------------------+
- | Grants for [email protected] |
- +------------------------------------------------+
- | GRANT USAGE ON *.* TO `db_rw_user`@`localhost` |
- | GRANT `db_rw`@`%` TO `db_rw_user`@`localhost` |
- +------------------------------------------------+
- 2 rows in set (0.00 sec)
是否注意到, 执行 show grants 语句只是看到了用户被赋予了角色, 该角色具有哪些权限该如何查看呢? 执行下面的语句可以确认相关内容:
- [email protected]:MySQL.sock 21:01: [(none)]>show grants for 'db_rw_user'@'localhost' using 'db_rw';
- +--------------------------------------------------------------------------------+
- | Grants for [email protected] |
- +--------------------------------------------------------------------------------+
- | GRANT USAGE ON *.* TO `db_rw_user`@`localhost` |
- | GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `db_rw_user`@`localhost` |
- | GRANT `db_rw`@`%` TO `db_rw_user`@`localhost` |
- +--------------------------------------------------------------------------------+
- 3 rows in set (0.00 sec)
七, 强制性角色:
MySQL 可以通过 mandatory_roles 变量来配置强制性角色. 使用强制性角色, 服务器会为全部的账户默认赋予该角色,
而不需要显示执行赋予角色. 可以使用 my.cnf 文件或者使用 SET PERSIST 进行配置, 例如:
- [mysqld]
- mandatory_roles='role1,[email protected]'
- SET PERSIST mandatory_roles = 'role1,[email protected];
需要注意的是, 配置在 mandatory_roles 中的角色不能撤销其权限, 也不能删除.
八, 角色自动激活:
赋予用户帐户的角色在帐户会话中可以处于活动状态, 也可以处于非活动状态. 如果赋予的角色在会话中处于活动状态,
则具有相应的权限, 反之则没有. 要确定当前会话中哪些角色处于活动状态, 使用 CURRENT_ROLE() 函数.
- [email protected]:MySQL.sock 21:01: [(none)]>select CURRENT_ROLE();
- +----------------+
- | CURRENT_ROLE() |
- +----------------+
- | NONE |
- +----------------+
- 1 row in set (0.00 sec)
默认情况下, 向帐户赋予角色或在 mandatory_roles 系统变量值中为其命名后, 该角色在帐户会话中不会变为活动状态.
要指定每次用户连接到服务器, 进行身份验证时激活角色, 请使用 SET DEFAULT ROLE:
- [email protected]:MySQL.sock 21:04: [(none)]>set default role all to 'db_dev_user'@'localhost', 'db_rw_user'@'localhost', 'db_read_user'@'localhost';
- Query OK, 0 rows affected (0.06 sec)
之后, 用 app_dev_user 登陆服务器, 查看当前角色权限:
- [[email protected] ~]# MySQL -udb_rw_user -p'passjw03'
- [email protected]:MySQL.sock 21:11: [(none)]>show databases;
- +--------------------+
- | Database |
- +--------------------+
- | app_db |
- | information_schema |
- +--------------------+
- [email protected]:MySQL.sock 21:11: [(none)]>select CURRENT_ROLE();
- +----------------+
- | CURRENT_ROLE() |
- +----------------+
- | `db_rw`@`%` |
- +----------------+
- 1 row in set (0.00 sec)
查看当前登录用户:
- [email protected]:MySQL.sock 10:39: [(none)]>select current_user();
- +----------------------+
- | current_user() |
- +----------------------+
- | [email protected] |
- +----------------------+
- 1 row in set (0.00 sec)
- [email protected]:MySQL.sock 10:39: [(none)]>select current_user;
- +----------------------+
- | current_user |
- +----------------------+
- | [email protected] |
- +----------------------+
- 1 row in set (0.00 sec)
要在用户连接到服务器时, 使所有显式赋予的角色和强制角色自动激活, 请启用 activate_all_roles_on_login 系统变量. 默认情况下, 禁用自动角色激活.
关于 MySQL 中使用角色就介绍到这里, 更为详尽的内容请访问官网手册
https://dev.mysql.com/doc/refman/8.0/en/roles.html
来源: http://www.bubuko.com/infodetail-3414958.html