当前位置: 首页 > article >正文

56 mysql 用户权限相关的实现

前言

这里讨论 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.kler.cn/a/317342.html

相关文章:

  • 官方压测工具memtier-benchmark压测redis
  • sql分区
  • QT<30> Qt中使鼠标变为转圈忙状态
  • C语言打印时间精确到毫秒
  • Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用
  • 高级java每日一道面试题-2024年11月06日-JVM篇-什么是 Class 文件? Class 文件主要的信息结构有哪些?
  • Spring高手之路24——事务类型及传播行为实战指南
  • DHCP中继工作原理
  • 算法【Dijkstra算法及分层图最短路】
  • WPF实现关系图
  • Vue开发前端图片上传给java后端
  • MMD模型一键完美导入UE5-VRM4U插件方案(一)
  • 为什么三星、OPPO、红米都在用它?联发科12nm级射频芯片的深度剖析
  • Fyne ( go跨平台GUI )中文文档-入门(一)
  • Adobe预览今年晚些时候推出的AI视频工具
  • RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?
  • 深入理解Vue3中style的scoped
  • 简单计算器(python基础代码撰写)
  • Vue3:具名插槽
  • 微信小程序07-开发进阶
  • c++难点核心笔记(一)
  • 基于SpringBoot+Vue的在线问诊管理系统
  • 【觅图网-注册安全分析报告-无验证方式导致安全隐患】
  • 爬虫逆向学习(七):补环境动态生成某数四代后缀MmEwMD
  • AIGC时代!AI的“iPhone时刻”与投资机遇
  • Electron 隐藏顶部菜单