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

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

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

 

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

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

 

先创建一个角色

1
create role R1;

 

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

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

  

创建一个新用户

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

  

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

1
grant R1 to U1@'localhost';

  

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

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

会有如下显示:

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

  

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

1
2
exit<br># 密码为123456
mysql -u U1 -p

 

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

1
use test;

出现了如下错误:

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

 

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

 

原来是角色没有被激活!

原来是角色没有被激活!

原来是角色没有被激活!

 

查看角色激活情况

1
SELECT CURRENT_ROLE();

  

激活角色有两种方法:

  1、非永久激活:

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

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

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

SET global activate_all_roles_on_login=ON;

 

 

  

 

posted @   先娶国王后取经  阅读(2035)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示