- 浏览: 789216 次
- 性别:
- 来自: 杭州
最新评论
-
137578346:
...
各版本MySQL并行复制的实现及优缺点 -
db_code_peon:
引用而这个“调整”,也不是简单的指针重赋,而是将这个page ...
MySQL源码学习:简述InnoDB的BP LRU策略 -
xtha21:
预申请ID的个数为:大于批量插入记录数的最近一个2的指数值再- ...
MySQL源码学习:innodb_autoinc_lock_mode 下自增id不连续的原因 -
lc15808798846:
奇哥好试了下,好像这个问题在5.7 已经不存在了,SQL不会h ...
autocommit=0引起的业务hang住 -
wangliushui:
Transfer 怎样保证事物的一致性,一个事物关联多个表的 ...
MySQL-Transfer2.2发布
这个问题是从被问到information_schema.user_privilege的IS_GRANTABLE字段问题开始查起的,就先从user_privilege表的显示规则说起。
1、 IS_GRANTABLE字段
用root账号执行如下语句(本文中grant后都接flush privileges, 不赘述)
a) grant all privileges on *.* to `myuser`@localhost with grant option;
b) select user,select_priv from mysql.user where user='myuser'; +------------------------------+----------------------------+ | user | select_priv | +------------------------------+----------------------------+ | myuser | Y | +------------------------------+----------------------------+
c) select PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '\'myuser\'@\'localhost\'' and PRIVILEGE_TYPE = ‘SELECT’; +------------------------------+----------------------------+ | PRIVILEGE_TYPE | IS_GRANTABLE | +------------------------------+----------------------------+ | SELECT | NO | +------------------------------+----------------------------+
|
说明: 从b)看myuser已经有了select_priv。而c) 中 IS_GRANTABLE是NO,这不是显示错误。 实际上,IS_GRANTABLE并非表示用户是否“拥有此权限”,而是表示用户是否拥有“将此权限赋予其他用户”的权限。它对应的是mysql.user表中的grant_priv字段,此时为NO。
2、user_privileges的显示规则
当我们创建一个新用户create user myuser2; 时,在mysql.user中看到这个用户的所有权限都为NO,此时user_privileges增加一行
+---------------------+-----------------------+--------------------------+---------------------+ | GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE | | 'myuser2'@'%' | NULL | USAGE | NO |. +---------------------+-----------------------+--------------------------+---------------------+ |
什么时候显示USAGE? 从这篇文章中我们知道对应的显示控制代吗在sql/sql_show.cc。 对应的函数为fill_schema_schema_privileges。
简单分析源码得到规则如下:
PRIVILEGE_TYPE规则:
a) 当该用户没有权限,或只有grant_priv的时候,PRIVILEGE_TYPE显示为USAGE;
b) 否则按顺序显示被赋予的权限,每行一个,这些权限包括
(UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL | LOCK_TABLES_ACL | EXECUTE_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | CREATE_PROC_ACL | ALTER_PROC_ACL | EVENT_ACL | TRIGGER_ACL), 但GRANT权限不显示。
IS_GRANTABLE规则:若该用户有grant_priv权限,则在列出的所有行的IS_GRANTABLE都显示YES,否则显示NO。
================================标题党的分割线================================
3、权限控制问题
从上面的分析中我们知道,用户是否拥有给其他用户赋权的权限,取决于这个用户本身是否拥有grant_priv权限。用一个字段控制一批权限,这样就联想到可能有一个“权限混乱“的现象。
首先,授权必然是要有范围限制的。用户A赋权给用户B,这些赋予的权限不能超过A的权限范围。
看以下的操作序列。使用root账户登录。
mysql> grant select,insert,delete,update on *.* to `grant_u2`@localhost ; Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
mysql> select * from information_schema.user_privileges where grantee like '%gran_u%'; Empty set (0.01 sec)
mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%'; +--------------------------------+----------------------------+--------------------+ | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE | +--------------------------------+----------------------------+--------------------+ | 'grant_u1'@'localhost' | SELECT | YES | | 'grant_u2'@'localhost' | SELECT | NO | | 'grant_u2'@'localhost' | INSERT | NO | | 'grant_u2'@'localhost' | UPDATE | NO | | 'grant_u2'@'localhost' | DELETE | NO | +-------------------------------+-------------------------------+-------------------+ |
说明:上面的操作中,我们给grant_u1赋了查询权限且with grant option. 给grant_u2赋了增删改查权限,但没有grant权限。
从information_schema.user_privileges看出目前权限状态正常。
之后用grant_u1登录, 将select的“赋权”权限赋给grant_u2.
mysql> grant select on *.* to `grant_u2`@localhost with grant option ; Query OK, 0 rows affected (0.00 sec) mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%'; +--------------------------------+----------------------------+--------------------+ | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE | +--------------------------------+----------------------------+--------------------+ | 'grant_u1'@'localhost' | SELECT | YES | | 'grant_u2'@'localhost' | SELECT | YES | | 'grant_u2'@'localhost' | INSERT | YES | | 'grant_u2'@'localhost' | UPDATE | YES | | 'grant_u2'@'localhost' | DELETE | YES | +-------------------------------+-------------------------------+-------------------+ 5 rows in set (0.00 sec) |
从结果看出,grant_u2用户拥有了对增删改查的赋权权限。这个已经超出了grant_u1的权限范围。
进一步的,再用grant_u2登录,执行grant select,insert,delete,update on *.* to `grant_u1`@localhost with grant option ; 则grant_u1用户也拥有了增删改查的赋权权限。
实际上,root账号设置的权限中,grant_u1、grant_u2都没有对增删改的赋权权限,但经过上述操作后,这两个用户的权限都扩大了,且超过了原有权限的并集。
4、分析
实际上这个问题的根源,就在于MySQL在设计上用一个grant_priv来控制是否有赋权权限,而每个概念上将每个权限分开。导致在grant_u1将“查询赋权”权限赋给grant_u2的时候,附带的将其他权限也带进去了。
评论
发表评论
-
各版本MySQL并行复制的实现及优缺点
2016-01-19 18:02 11762MySQL并行复制已经是老生常谈,笔者从2010年开 ... -
一个mysqldump导出失败的案例分析
2014-06-03 23:16 8186背景 MySQL全量逻辑备份恢复最基础的方法,就是m ... -
MySQL 聚集UDF,计算列表中的奇数总和
2014-06-02 23:08 2833技痒之作 -__- CREATE AGG ... -
autocommit=0引起的业务hang住
2014-05-25 17:53 8367背景 有用户报告一个普通的select 语句被hang住 ... -
一个用户SQL慢查询分析,原因及优化
2014-05-23 03:25 11845问题描述 一个用户反 ... -
一个用户迁移数据库前后的性能差异case
2014-05-21 14:21 3394问题 一个用户问题,数据从ECS迁移到RDS,相同的 ... -
MySQL一个异常查询问题追查
2014-05-16 12:38 4352问题 线上碰到的问题:相同的语句,只是最后的limit行 ... -
Webscalesql代码浏览记录
2014-04-03 18:28 3643浏览了下webscalesql 的代码。目前包含的62个c ... -
Webscalesql代码浏览记录
2014-04-03 18:27 1981浏览了下webscalesql 的代码。目前包含的62个co ... -
Webscalesql代码浏览记录
2014-04-03 18:27 3053浏览了下webscalesql 的代码。目前包含的62个co ... -
MySQL Q&A 解析binlog的两个问题
2014-03-31 17:18 4788连续碰到两个同学问类似的问题,必须要记录一下。 问题 ... -
mymysql与go-mysql-driver的一个区别
2014-01-23 21:16 4889今天要写个工具就想顺便学下go。网上翻了下发现用比较多的是 ... -
MySQL-Transfer2.3发布
2013-12-01 21:17 6380Transfer 2.3发布,下载地址 此版本除了升 ... -
关于MySQL count(distinct) 逻辑的另一个bug
2013-11-28 09:59 5928背景 上一篇博文(链接)介绍了count ... -
Is it a bug in MySQL or in java-connector?
2013-11-19 13:58 3096Description In mysql ... -
关于MySQL count(distinct) 逻辑的一个bug
2013-11-16 22:56 9156背景 客户报告了一个count(d ... -
MySQL-Transfer2.2发布
2013-06-18 12:08 4751Transfer 2.2发布。下载地址 版本说明 ... -
MySQL5.5加主键锁读问题—续
2013-06-14 17:38 2487背景 上一篇说到MySQL 5.5加主键导致 ... -
MySQL5.5加主键锁读问题
2013-06-09 09:30 4631背景 有同 ... -
InnoDB row_id边界溢出验证
2013-05-28 13:34 2643背景 跟同学聊到row_id一个边界问题 ...
相关推荐
MySQL数据库的权限及其安全缺陷.pdf
MySQL数据库的权限及其安全缺陷 (1).pdf
基于SSM+MySQL的软件缺陷管理系统是一个用于跟踪和管理软件开发过程中的缺陷和问题的在线平台。...用户权限管理:系统支持多级用户权限管理,可以根据用户角色进行权限的分配和控制,确保数据的安全性和机密性。
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制, 阶段1:连接核实 5.7.6. 访问控制, 阶段2:请求核实 ...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
(1)管理员登录:管理员进入软件缺陷管理系统进行各类信息管理之前,为了系统以及用户的安全,管理员必须通过输入密码登录进入后台管理系统,才能进行其他的操作。 (2)欢迎页:登录成功来到系统首页,管理员将看到...
7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...
SSM项目-软件缺陷管理系统的Java毕业设计(源码+说明+演示视频).zip 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...
基于Java+SSM的软件缺陷管理系统毕业设计(源码+说明+演示视频).zip 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...
Java毕业设计-基于ssm框架的软件缺陷管理系统(源码+说明+演示视频) 【项目技术】 java+mysql+ssm+b/s 【实现功能】 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所具有的权限也不一样...