原文网址:MySQL8--通过角色管理权限_IT利刃出鞘的博客-CSDN博客
简介
本文介绍MySQL8如何通过角色管理权限。
角色是在MySQL8.0中引入的新功能。在MySQL中,角色是权限的集合,可以为角色添加或移除权限。用户可以被赋予角色,同时也被授予角色包含的权限。
在实际应用中,为了安全性,需要给用户授予权限。当用户数量较多时,可以先将权限集合放入角色中,再赋予用户相应的角色。
查看角色
语法
跟查看用户的语法是一样的
SELECT host, user, plugin FROM mysql.user;
创建角色
语法
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]
role_name 代表你要创建的此数据库的新用户账号
host_name 代表允许访问的主机。如果host_name省略,默认为%。如下
- %代表通配所有host地址权限(可远程访问)
- localhost为本地权限(不可远程访问)
- 指定某个ip访问权限,如10.138.106.102
示例
创建名字为crudRole的角色,所有主机可访问。
CREATE ROLE 'crudRole'@'%';
查看角色
查看角色权限
语法
SHOW GRANTS FOR 'role_name';
默认情况下,系统自动给赋予 ‘USAGE’ 权限,意思是连接登录数据库的权限。
示例
查看crudRole角色的权限
给角色赋予权限
创建角色后,默认这个角色是没有任何权限的,需要给角色授权。
语法
给角色授权的语法是:
GRANT '#auth' ON '#databaseName'.'#tableName' TO '#roleName'@'#host';
#auth 代表权限,例如
- ALL 全部权限
- SELECT 查询权限(单个)
- SELECT,INSERT,UPDATE,DELETE 增删改查权限(多个权限)
#databaseName 代表数据库名
- *代表全部库
#tableName 代表具体表,如下
- *代表全部表
- A,B 代表具体A,B表
#roleName 代表角色名
#host 代表允许访问的主机,如果host_name省略,默认为%。详情如下:
- %代表通配所有host地址权限(可远程访问)
- localhost为本地权限(不可远程访问)
- 指定某个ip访问权限,如10.138.106.102
支持的权限有这些
示例
给crudRole角色赋予增删改查权限。
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'crudRole'@'%';
执行完后要刷新一下权限。
FLUSH PRIVILEGES;
查看权限
撤销角色的权限
角色授权后,可以对角色的权限进行维护,对权限进行添加或撤销。添加权限使用GRANT语句(与角色授权相同)。撤销角色权限使用REVOKE语句。
语法如下:
REVOKE 权限1,权限2,....权限n ON TABLENAME FROM 'rolename';
给用户赋予角色
角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。
语法
GRANT role [,role2,...] TO user [,user2,...];
注意:user必须是存在的用户,如果不存在先创建用户。
示例
创建用户user1
CREATE USER 'user1'@'%' IDENTIFIED BY '111111';
给user1赋予crudRole角色
GRANT crudRole TO user1;
查看user1的角色
SHOW GRANTS FOR 'user1'@'%';
激活角色
创建了角色之后,默认都是没有被激活。只有授予的角色在会话中处于激活状态时,该用户才拥有此角色的权限。
查看激活状态
先登录user1账户(密码是111111)
查看当前角色:
SELECT CURRENT_ROLE();
可见,是没有角色。
激活角色
激活角色有两种方式:
法1:SET DEFAULT ROLE 命令
SET DEFAULT ROLE role_name TO 'user_name'@'host';
用户需重新登录。
示例
然后user1重新登录, 然后查看角色:
法2:将ACTIVATE_ALL_ROLES_ON_LOGIN设置为 ON
SET GLOBAL activate_all_roles_on_login=ON;
上边这条语句的意思是对所有角色永久激活,运行这条语句之后用户才真正拥有了赋予角色的所有权限。
查看此变量的命令:
SHOW VARIABLES LIKE 'activate_all_roles_on_login';
撤销用户的角色
REVOKE role_name FROM user_name;
设置强制角色
强制角色是给每个创建账户的默认角色,不需要手动设置。强制角色无法被REVOKE 或者 DROP 。
方式1:配置文件
[mysqld]
mandatory_roles='role1,role2....'
方式2:运行时设置
SET PERSIST mandatory_roles='role1,role2...';
SET GLOBAL mandatory_roles='role1,role2...';
删除角色
语法
DROP ROLE role [,role2]....
如果删除了角色,那么用户也就失去了通过这个角色所获得的所有权限。
其他网址
认真学习MySQL中的角色权限控制_流烟默的博客-CSDN博客_mysql角色权限