您的位置:首页 > 文旅 > 美景 > 河南省建设工程造价信息网官网_东莞虎门哪里好玩_百度搜索广告价格_社群营销的方法和技巧

河南省建设工程造价信息网官网_东莞虎门哪里好玩_百度搜索广告价格_社群营销的方法和技巧

2024/12/23 15:32:48 来源:https://blog.csdn.net/u011039332/article/details/132256824  浏览:    关键词:河南省建设工程造价信息网官网_东莞虎门哪里好玩_百度搜索广告价格_社群营销的方法和技巧
河南省建设工程造价信息网官网_东莞虎门哪里好玩_百度搜索广告价格_社群营销的方法和技巧

前言

这里讨论 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

 

 

 完

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com