MySQL 角色管理
# MySQL 角色管理
MySQL 8.0 引入了角色(Role)功能,这是一种权限管理的新方式,可以简化用户权限的管理。
# 创建角色
CREATE ROLE 'test_role'@'%';
1
# 授权角色
GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'test_role'@'%';
1
# 将角色分配给用户
CREATE USER 'test'@'192.168.1.1' IDENTIFIED BY '';
CREATE USER 'test1'@'192.168.1.2' IDENTIFIED BY '';
GRANT 'test_role'@'%' TO 'test'@'192.168.1.1', 'test1'@'192.168.1.2';
1
2
3
2
3
# 激活角色
SET DEFAULT ROLE 'test_role'@'%' TO 'test1'@'192.168.1.2';
SELECT CURRENT_ROLE();
1
2
2
这种"激活"角色的方法可以让用户拥有角色所拥有的权限,但是不难看出来,每次给新建用户绑定一个角色,在新建用户登录之前,都得将该用户激活一下,从操作上看不是特别方便,如何让所有的指定的角色都即时生效呢?
MySQL提供了一个系统参数来解决这个问题,该参数是:
mysql> SHOW VARIABLES LIKE '%activate%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF |
+-----------------------------+-------+
1 row in set (0.00 sec)
-- 该参数是默认关闭的,直接打开即可。
SET GLOBAL activate_all_roles_on_login=ON;
-- 持久化
-- sed -i '79i\\activate_all_roles_on_login = on' /data/db/mysql3306/my.cnf
-- MySQL 8.0 永久生效,并写入 mysql 的 datadir 的 mysqld-auto.cnf 文件中
SET PERSIST activate_all_roles_on_login=ON;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 撤销角色权限
REVOKE INSERT, UPDATE, DELETE ON testdb.* FROM 'test_role'@'%';
1
# 删除角色
DROP ROLE 'test_role'@'%';
1
# 角色管理相关命令
# 查看用户角色
-- 查看当前用户的角色
SELECT * FROM mysql.default_roles;
-- 查看用户的所有角色
SELECT * FROM mysql.role_edges;
1
2
3
4
5
2
3
4
5
# 角色继承
-- 创建一个基础角色
CREATE ROLE 'basic_role'@'%';
GRANT SELECT ON testdb.* TO 'basic_role'@'%';
-- 创建一个高级角色,继承基础角色
CREATE ROLE 'advanced_role'@'%';
GRANT 'basic_role'@'%' TO 'advanced_role'@'%';
GRANT INSERT, UPDATE ON testdb.* TO 'advanced_role'@'%';
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 最佳实践
- 合理设计角色层次:避免过于复杂的角色继承关系
- 最小权限原则:给角色分配最小必需的权限
- 定期审查:定期检查角色权限分配的合理性
- 使用持久化设置:通过SET PERSIST确保配置的持久性
上次更新: 3/18/2026