56 mysql 用户权限相关的实现

news/2024/10/17 17:53:46/

前言

这里讨论 mysql 的权限相关处理 

使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限 

create user 'tz_test'@'%' identified by 'tz_test';

grant select on test_02.* to 'tz_test'@'%';

 

查询目标数据表, 数据如下, tz_test_02

23c12202d8eb5408cb1c00bad53add24.png

 

 

UPDATE command denied to user 'tz_test'@'192.168.220.1' for table 'tz_test_02'

执行 update 之后, 客户端这边 得到的信息如下

f32c9c6ffb105f2cb0301bc92e991fad.png

 

这里对于当前用户 tz_test 访问 tz_test_02 数据表 验证在这里, 由于上面 check_grant 这边验证 tz_test 用户没有 test_02.tz_test_02 的 UPDATE 权限, 这里是响应的错误信息给客户端 “UPDATE command denied to user 'tz_test'@'192.168.220.1' for table 'tz_test_02'”

829fa5dbfaeefbab46e96e43d6559220.png

 

首先看一下 各个权限的标志, 分别对应于 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP 等等各个权限 

e7aeaebdb792b1c8b344bcfbce3a24d9.png 

 

结合这里的上下文, 我们可以看到的是 tz_test 用户在 192.168.220.1 上面访问 mysql 服务器 

期望 对 test_02 库的 tz_test_02 表 执行 UPDATE 相关操作

然后这里 tz_test@192.168.220.1 对于 test_02.tz_test_02 的权限仅仅只有 SELECT 权限 

0a3c4e57f5cae88fa35e51483116267e.png

 

然后 table_hash_search 是查询 是否有 数据库表粒度的权限配置, 这部分的配置是持久化在 mysql.tables_priv 中, 然后加载到了 column_priv_hash 中, table_hash_search 中查询到的 HASH 是 column_priv_hash

如果 上面数据库粒度的 UPDATE 权限也没有, 然后 这里具体到某张表粒度的权限也没有, 那么就是 当前用户在当前主机上 没有访问 目标数据库的目标数据表 的 更新权限

然后 走了后面的 “goto err” 响应错误信息给客户端 

6cdf80b809e50bd7112ab88c54c8b59a.png

 

获取 tz_test@192.168.220.1 访问 test_02.tz_test_02 的权限的地方 

这里是从 thd->security_context()->db_access() 获取的数据 

85c60b27a704684236f3b3dd6d618a02.png

 

thd->security_context()->db_access() 是来自于切换数据库的时候, 有更新 当前用户@当前主机 访问目标数据库 的权限信息

acl_get 通过 user@host -> db 去从 mysql.db 中获取 权限信息

然后 下面 mysql_change_db_impl 更新权限信息到 thd->m_security_ctx->m_db_access

fa71b4cf274f32fb6022b4ba6fb52c51.png

 

acl_get 中遍历 acl_dbs 列表去查询 user@host -> db 的认证信息 

三层比较, user, ip, db, 对应的就是 user@host -> db

3385fb82165c5549ab08d5294ee5b17e.png

 

设置当前 session[user@host] 访问 目标数据库 的权限信息

35ba40dd26038878884443663803323c.png 

以上就是整体流程

切换数据库的时候, 会从 acl_dbs[对应的是 mysql.db 的数据] 中查询 user@host -> db 的认证信息, 保存到当前 session 的上下文 

然后 业务查询过来了之后, check_access 将该认证信息 传递到 table->grant->db_access

然后 check_grant 中来做具体的权限校验

如果 数据库权限中没有该权限, 并且 数据表权限 中没有该权限, 则响应 TABLEACCESS_DENIED_ERROR

 

 

acl_dbs 的加载 

遍历的是 mysql.db 这张数据表, 然后来加载数据, 之后放到 acl_dbs

fd221d9c5171354f880118e8f57d54aa.png

 

get_access 中获取的是当前记录行的各个标记组成的 access 数字 

主要就是 (user@host -> db) -> access 的一个映射 

ec13b8b94ea27c3d5385f914ff49ca79.png 

获取 access 的方式如下 

遍历各个 权限表示的字段, 加上各自的权重, 然后组成 access 

8f25b0ae6a32adae6b2e048440d04b34.png

 

 

 column_priv_hash 的加载 

这里面加载的是 mysql.tables_priv 数据表, 对应的是 (user@host -> db@tableName) -> access 的一个映射, 数据是维护熬了 column_priv_hash 中 

如下是 初始化的操作, 遍历 mysql.tables_priv 的记录信息, 封装成为 GRANT_TABLE 数据, 然后将数据插入到 column_priv_hash 中 

然后 使用是在 check_grant 中使用的 

f2548c21bce22033626868e8e5f2cba9.png

 

根据 mysql.tables_priv 记录信息, 创建 GRANT_TABLE 的信息 

主要是 (user@host -> db@tableName) -> access

f9b0087129c3391f362fa73601ee0bc2.png

 

 

 完

 

 

 


http://www.ppmy.cn/news/1532676.html

相关文章

QT 界面编程中使用协程

QT 界面编程中使用协程 一、概述二、集成2.1、编译 Acl2.2、将 Acl 库集成到 QT 项目中2.3、开始编写代码2.3.1、QT 程序初始化时初始化 Acl 协程2.3.2、在界面中创建协程2.3.3、界面程序退出前需要停止协程调度2.3.4、在界面线程中下载数据2.3.5、在协程中延迟创建窗口 2.4、效…

HUAWEI WATCH GT 系列安装第三方应用

文章目录 适用机型概述官方文档从源码构建 hap 文件和对源码签名下载和安装DevEco Studio下载和安装首次启动推荐:设置IDE推荐的兼容版本环境(可选)安装并启用中文菜单插件 使用DevEco Studio打开项目并进行构建构建问题解决一、生成密钥和证…

数据分析师之Excel学习

前言 excel作为职场人来说,已经是人人必备的技能了,所以还不知道这个的小伙伴,一定要抓紧时间学习,紧跟时代的步伐。 Excel 几个重要的版本 97-2003版本是国内最早流行的版本 .xlsx后缀的表格文件,基本是07版本及…

Leetcode 968. 监控二叉树 树形dp、状态机 C++实现

问题:Leetcode 968. 监控二叉树 给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 /*** Definition for a binary tree node.* struct TreeNo…

Linux-基础实操篇-组管理和权限管理(上)

Linux 组基本介绍 在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。 用户和组的基本概念: 用户名:用来识别用户的名称,可以是字母、数字组成的字符串&#xff0…

开源实战分享 | 新书:《大型语言模型实战手册》随书代码分享

《大型语言模型实战手册》(英文版)目前电子版在亚马逊有售,纸质版预计在2024年10月15日开售。该书通过超过275张定制插图,深入探索大型语言模型的世界,为Python开发者提供使用大型语言模型所需的实用工具和概念。 如果对于插图没有特别执念的…

消息中间件:RabbitMQ

消息中间件:RabbitMQ 前言安装Window安装Linux安装 管理页面什么是RabbitMQ?入门基本概念简单队列工作队列(Work Queues)发布/订阅(Publish/Subscribe)临时队列 路由(Routing)主题&a…

光控资本:股票后边带个u是啥意思,常见股票后缀字母还有哪些?

股票后面带有字母U标明该股票发行人到目前为止还没有盈利,这是根据上交所发布的《关于科创板股票及存托凭证生意相关事项的奉告》中的规则,在上市后实现初度盈利,这个标识就会消除掉。一般是在科创板上市的股票会有U的标明,且一般…