MySQL 8.0中为什么通过角色授予的权限使用不了?————角色激活

角色是权限的集合,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程,从而大大提高了开发效率。

然而在实际实践中,居然有一个大坑!————角色没有被激活

 

这坑有点深,只可惜坑天生就是可以被填的!

下面来复述一下我的踩坑过程。

 

先创建一个角色

create role R1;

 

进入一个数据库中,为角色授予权限

use test;
# 将对student表的所有操作权限都赋予给角色R1 grant all on student to R1;

  

创建一个新用户

# 新用户名字为U1, 登录密码为123456
create user U1@'localhost' identified by '123456';

  

将角色R1所拥有的权限授予给用户U1

grant R1 to U1@'localhost';

  

查看此时用户U1所拥有的权限

show grants for U1@'localhost';
# 如果还想知道用户通过角色拥有哪些权限,可以在结尾加个using role,即:
show grants for U1@'localhost' using R1;

会有如下显示:

# USAGE表示无权限
GRANT USAGE ON *.* TO `U1`@`localhost`
# 刚刚通过角色R1授予的权限 GRANT `R1`@`%` TO `U1`@`localhost`

  

既然如此,不就大功告成了!换用户U1登录验证一下

exit
# 密码为123456 mysql -u U1 -p

 

此时用户U1应该可以对test数据库中student表进行操作,那就使用test数据库查看一下

use test;

出现了如下错误:

ERROR 1044 (42000): Access denied for user 'U1'@'localhost' to database 'test'

 

什么鬼,反复检查上述过程,肯定是没错的,那是什么问题啊啊啊啊啊啊。。。

 

原来是角色没有被激活!

原来是角色没有被激活!

原来是角色没有被激活!

 

查看角色激活情况

SELECT CURRENT_ROLE();

  

激活角色有两种方法:

  1、非永久激活:

# 第一种方式
set default role all to U1@'localhost'; # 第二种方式
set default R1 to U1@'localhost';
# 注意若此时立即再使用命令select current_role();还是会显示没有角色被激活。
# 我们应该先退出,换用户U1登录再查看
exit
mysql -u U1 -p
select current_role();
# 现在可以看到角色R1已经被激活了
show databases;
use test;
show tables;
select * from student;

  2、永久激活:(用户连接到服务器时自动激活所有显式授权和强制角色)

    注:默认情况下,禁用自动角色激活。

SET global activate_all_roles_on_login=ON;

 

 

  

 

posted @ 2020-07-25 17:28  先娶国王后取经  阅读(1902)  评论(0编辑  收藏  举报