在mysql 8.0及以上版本中,角色功能被正式引入,它是一组权限的集合,能够简化多用户权限管理的复杂度,避免重复为每个用户单独分配相同权限。通过角色管理权限,只需要维护角色对应的权限集合,再将角色分配给对应用户即可,大幅提升了权限管理的效率。

mysql角色权限管理基础操作
1. 创建角色
创建角色使用CREATE ROLE语句,角色名称可以包含主机部分,默认主机为%,表示允许从任意主机连接使用该角色。如果需要创建仅本地可用的角色,可以指定主机为localhost。
-- 创建全局可读的角色,允许从任意主机使用 CREATE ROLE 'read_role'; -- 创建仅本地可用的读写角色 CREATE ROLE 'write_role'@'localhost'; -- 查看当前所有角色 SELECT * FROM mysql.user WHERE is_role = 'Y';
2. 给角色授予权限
给角色授予权限的语法和直接给用户授予权限类似,使用GRANT语句,指定权限范围、权限类型和角色名称即可。权限范围可以是全局、数据库级、表级甚至列级。
-- 给read_role角色授予所有数据库的查询权限 GRANT SELECT ON *.* TO 'read_role'; -- 给write_role角色授予test_db数据库的增删改查权限 GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'write_role'@'localhost'; -- 给角色授予特定列的更新权限 GRANT UPDATE(name, age) ON test_db.user TO 'write_role'@'localhost'; -- 查看角色的权限 SHOW GRANTS FOR 'read_role';
3. 将角色分配给用户
角色创建并授予权限后,需要将角色绑定到对应的用户账号上,用户才能继承角色的权限。分配角色使用GRANT语句,后面跟上TO指定用户,可选WITH ADMIN OPTION允许用户将角色再分配给其他用户。
-- 创建测试用户 CREATE USER 'test_user'@'%' IDENTIFIED BY 'Test@123'; -- 将read_role角色分配给test_user GRANT 'read_role' TO 'test_user'@'%'; -- 将write_role角色分配给test_user,允许用户转授角色 GRANT 'write_role'@'localhost' TO 'test_user'@'%' WITH ADMIN OPTION; -- 查看用户拥有的角色 SELECT * FROM mysql.role_edges WHERE TO_USER = 'test_user';
4. 设置用户默认激活的角色
角色分配给用户后,默认不会自动激活,用户登录后需要手动激活角色才能使用对应权限。可以设置用户的默认角色,用户登录时自动激活这些角色。
-- 设置test_user的默认激活角色为read_role SET DEFAULT ROLE 'read_role' TO 'test_user'@'%'; -- 设置所有分配给test_user的角色为默认激活 SET DEFAULT ROLE ALL TO 'test_user'@'%'; -- 查看用户的默认角色 SELECT * FROM mysql.default_roles WHERE USER = 'test_user';
角色权限回收与删除
1. 回收角色的权限
如果需要调整角色对应的权限,可以使用REVOKE语句回收角色的指定权限,语法和回收用户权限一致。
-- 回收read_role角色的全局查询权限 REVOKE SELECT ON *.* FROM 'read_role'; -- 回收write_role角色对test_db库的删除权限 REVOKE DELETE ON test_db.* FROM 'write_role'@'localhost';
2. 回收用户的角色
如果用户不再需要某个角色,可以从用户身上回收该角色,回收后用户不再拥有该角色的权限。
-- 从test_user身上回收write_role角色 REVOKE 'write_role'@'localhost' FROM 'test_user'@'%';
3. 删除角色
如果角色不再使用,可以使用DROP ROLE语句删除角色,删除后所有绑定该角色的用户都会自动失去该角色的权限。
-- 删除read_role角色 DROP ROLE 'read_role'; -- 删除write_role角色 DROP ROLE 'write_role'@'localhost';
注意事项
- mysql 8.0之前的版本不支持角色功能,需要使用用户权限直接管理的方式。
- 角色权限修改后,已经激活该角色的用户需要重新登录或者手动执行
SET ROLE语句才能生效。 - 拥有
WITH ADMIN OPTION权限的用户可以回收自己拥有的角色,即使回收者没有被授予该角色的管理权限。 - 角色名称和用户名称不能重复,否则会创建失败。
合理的角色权限划分应当遵循最小权限原则,即只给用户分配完成工作所需的最小权限集合,避免权限过大引发数据泄露或误操作风险。