深入学习MySQL授权表

在本文中,我们将向读者详细介绍MySQL的授权表,并通过一些实例来讲解MySQL是如何提高这些授权表来实现用户访问控制的。我们首先介绍MySQL访问控制过程,然后说明tables_priv和columns_priv授权表,我们会给出与MySQL的tables_priv表有关的解释和范例。最后,我们介绍columns_priv授权表及其范例。[@more@]

 一、MySQL授权表概述

  MySQL服务器的特点之一是,它在控制每个用户行为方面提供了极大的灵活性。例如,我们既可以限制用户访问整个数据库,也可以限制用户访问数据库中特定的表,或者禁止访问特定表中的特定列。由此看出MySQL服务器在用户授权方面的灵活性。本文将向大家详细介绍MySQL服务器是如何处理用户权限的授与/撤回的,尤其是MySQL的授权表tables_priv和columns_priv。

  MySQL的授权系统通常是通过MySQL数据库中的五个表来实现的,这些表有user、db、host、tables_priv和columns_priv。这些表的用途各有不同,但是有一点是一致的,那就是都能够检验用户要做的事情是否为被允许的。每个表的字段都可分解为两类,一类为作用域字段,一类为权限字段。作用域字段用来标识主机、用户或者数据库;而权限字段则用来确定对于给定主机、用户或者数据库来说,哪些动作是允许的。下面,我们对这些表的作用做简单介绍:

  • user表——该表决定是否允许用户连接到服务器。如果允许连接,权限字段则为该用户的全局权限。
  • db表——用于决定哪些用户可以从哪些主机访问哪些数据库。包含在db表中的权限适用于这个表标识的数据库。
  • host表——当您想在db表的范围之内扩展一个条目时,就会用到这个表。举例来说,如果某个db允许通过多个主机访问的话,那么超级用户就可以让db表内将host列为空,然后用必要的主机名填充host表。
  • tables_priv表——该表与db表相似,不同之处是它用于表而不是数据库。这个表还包含一个其他字段类型,包括timestamp和grantor两个字段,用于存储时间戳和授权方。在本文后面我们会对这个表做进一步的讲解。
  • columns_priv——该表作用几乎与db和tables_priv表一样,不同之处是它提供的是针对某些表的特定列的权限。这个表也多出了一个字段类型,即其他字段,包括了一个timestamp列,用于存放时间戳。 在本文后面部分,我们还会对columns_priv表做进一步的说明。

  下面,我们通过如下几个方面对MySQL用户授权过程加以介绍:首先介绍MySQL访问控制过程,解答MySQL授权表是如何工作的;然后,我们介绍tables_priv和columns_priv授权表,我们会给出与MySQL的tables_priv表有关的解释和范例。最后,我们介绍与columns_priv授权表有关的解释和若干范例。

  二、MySQL服务器的访问控制

  现在让我们来看看MySQL服务器是如何通过用户特权来控制用户访问的。虽然这乍听起来好像挺吓人的,但是通过一个例子的演示,您就会发现其实事情没有我们想象的那么难以理解。

  首先,对用户的访问进行控制的时候,系统需要查看作为过滤器的一些授权表,这些表的使用过程是从一般到特殊,这些表包括:

  • User表
  • Db表
  • Host表
  • Tables_priv 表
  • Columns_priv 表

  此外,一旦连接到了服务器,一个用户可以使用两种类型的请求:

  • 管理请求(shutdown,reload,等)
  • 数据库相关的请求(insert,delete,等)

  当用户提交管理请求时,服务器只需查看user表,这是因为user表是唯一包含与管理工作有关的权限的一个表。然而,当用户提交数据库请求时,要查看的表就要更多了。

  您可能已经注意到了,这些授权表的内容好像有些重复,例如user表中有select权限,同时host和user表中也有同样的权限。但是,这样做自有其道理。我们可以考虑一下user表中全局性的与数据库相关的权限,也就是说,在这个表中授予用户的权限对服务器上的所有数据库都有效。这些权限可以被认为是超级用户权限。相反,包含在host和db表之内的与数据库相关的权限则是特定于主机或者数据库的。因此,让这个表内所有的权限保持为“N”不失为一个明智的选择。

  让我们假定我们的user和db表如下所示:

e0d1a787-cda5-4fa7-b959-92297424f87d.jpg

 情景1:失败的连接尝试

  用户“alessia”连接服务器时将被拒绝。因为,主机、用户和/或密码与保持在user表中的不匹配, 所以会拒绝用户的请求。

  情景2:user表中数据库权限为N,db表中数据库权限为Y

  1. 用户wj尝试连接时将会成功。

  2. 用户wj试图在数据库oats上执行Select命令。

  3. 服务器查看user表,对应于Select命令的条目的值为N,即表示拒绝。

  4. 服务器然后查看db表,对应于Select命令的表项的值为Y,即表示允许。

  5. 该请求将成功执行,因为该用户的db表中的SELECT字段的值为Y。

  情景3:user表中数据库权限为Y,db表中数据库权限为N

  1. 用户wj尝试连接时将会成功。

  2. 用户wj试图在数据库oats上执行Select命令。

  3. 服务器查看user表,对应于Select命令的表项的值为Y,即表示允许。 因为在user表之内授与的权限是全局性的,所以该请求会成功执行。

  情景4:user表中数据库权限为N,db表中数据库权限为N

  1. 用户wj尝试连接时将会成功。

  2. 用户wj试图在数据库oats上执行Select命令。

  3. 服务器查看user表,对应于Select命令的表项的值为N,即表示拒绝。

  4. 服务器现在会查看db表,对应于Select命令的表项的值为N,即表示拒绝。

  5. 服务器现在将查找tables_priv和columns_priv表。如果用户的请求符合表中赋予的权限,则准予访问。 否则,访问就会被拒绝。

  对于tables_priv和columns_priv表,后面会进一步加以详述。

  情景5:让我们假定下列情况为真:

  • user表中用户wj的host字段的值为%。
  • db表中用户wj对应的host字段的值为空。

  这时会发生什么情况呢?

  1. 用户wj尝试通过一个给定主机进行连接。

  2. 假设密码是正确的,那么就会连接成功,因为user表指出只要是通过用户名wj和有关密码进行连接的话,任何(字符%所代表的含义)主机都是允许的。

  3. MySQL服务器将查找db表,不过,这里没有指定主机。

  4. MySQL服务器现在将查看host表。如果该用户要连接的数据库以及用户建立连接时所在主机的名称都位于host表中,那么该用户就能够按照host表中所列出的权限来执行命令。 否则的话,用户将无法执行命令,实际上更本就无法连接。

  通过了解上述情形,读者就应该对授权系统有一定了解了。下面,我们再来仔细聊聊tables_priv表和columns_priv表。

 三、Tables_priv表与columns_priv表

  在上面介绍的五种授权表中,tables_priv和columns_priv是后来加入进来的,它们的主要目的是提供细粒度的用户控制。这两个表与授权表db非常类似,但是其控制的范围更加细致,即特定数据库中的特定的表。前面说过,超级用户可以通过授权表db来限制用户在一个数据库中的行为,有了这两个授权表,超级用户可以进一步控制用户针对每个表和每个字段的动作。所以,这给超级用户提供了更加灵活的控制选项。

  在深入学习对数据表的访问控制之前,首先让我们了解一下下列特性:

  • 通配符可以用于这两个表的host字段,但是不允许在Db、Table_name和Column_name字段使用通配符。
  • 权限字段被声明为SET字段。
  • tables_priv和columns_priv表只应当通过GRANT/REVOKE命令进行修改。通过INSERT命令向这两个表插入数据会导致服务器不稳定!
  • tables_priv表中的table_priv字段可以允许下列命令:Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。
  • tables_priv表中的column_priv字段允许下列命令:Select、Insert、Update和References。
  • columns_priv表中的type字段允许下列命令:Select、Insert、Update和References。

  授权表tables_priv

  下列是一个tables_priv表的示意图:

a6e59f1b-9fe3-488f-8ff7-cc61fcde76de.jpg

  下面简要介绍各字段的含义:

  • Host——适用于那些主机?
  • Db——适用于从上面的主机所连接的哪些数据库?
  • User——适用于来自上述主机的哪些用户?
  • Table_name——适用于上述数据库中的哪些表?
  • Table_priv——为这个表赋予哪些权限?
  • Column_priv——为这个表中的个字段赋予哪些权限?
  • Timestamp——这个权限是何时赋予的?
  • Grantor——谁授与该用户的这个权限?
  •  要想真正弄懂tables_priv表,最好的办法就是通过实例进行学习,下面我们就给出一些例子。

      例1:

    %> GRANT SELECT ON italy TO wj @314interactive .com;

      这条命令的作用是什么?以上命令允许来自主机314interactive.com的用户wj在表italy上至下一个SELECT语句。请记住,只有当给定数据库/主机和用户名对应的db或者host表中的SELECT字段的值为N时,才需要访问这个表。如果给定数据库/主机和用户名对应的db或者host表中的SELECT字段中有一个值为Y的话,那么就无需控制该tables_priv表。

      例2:

    %> GRANT SELECT , INSERT ON oats.italy TO wj @314interactive .com;

      这条命令的作用是什么?以上命令允许来自主机314interactive.com的用户wj对数据库oats中的数据表italy执行SELECT和INSERT语句。

      例3:

    %> REVOKE SELECT on oats.italy from wj @314interactive .com

      这条命令的作用是什么?以上命令撤消来自主机314interactive.com的用户wj对数据库oats中的表italy的执行SELECT的权限。

      重要的是要认识到,包含在tables_priv中的信息仅当host/db表不允许用户执行要求的功能所需的权限时才生效。如果给定的权限在host/db表中为Y,那么就无需考察tables_priv表。

      例4:

    %> GRANT SELECT (id,name,address,phone), update (address,phone) ON
    company.customers TO gilmore @314interactive .com;

      这条命令的作用是什么?以上命令将授予对company数据库中customers表内id、name、address和phone字段执行SELECT的权限,以及对address和phone字段执行UPDATE的权限。

      这将带来哪些影响?这条命令会修改tables_priv表和columns_priv表,这是因为它引用这两个表和表内特定的字段。

      例5:

    %> REVOKE UPDATE (address,phone) ON company.customers FROM gilmore @314interactive .com;

      这条命令的作用是什么?这个命令将撤消对company数据库中customers表内的address和phone字段执行UPDATE操作的权限。

      这将带来哪些影响?因为该命令直接涉及给定表中的某些字段,所以columns_priv表以及tables_priv表也会更新。

      前面说过,只有在必须的情况下才会使用授权表,举例来说,如果高优先级的表提供了适当的权限的话,那么就无需查阅优先级较低的授权表了。如果高优先级的表中对应命令的值为N,那么就需要进一步查看低优先级的授权表。

      四、小结

      在本文中,我们为读者详细介绍了MySQL的授权表,并通过一些实例来讲解MySQL是如何提高这些授权表来实现用户访问控制的。我们首先介绍了MySQL访问控制过程,解答了MySQL授权表是如何工作的;然后,我们介绍了tables_priv和columns_priv授权表,并提供了与MySQL的tables_priv表有关的解释和范例。最后,我们介绍了columns_priv授权表并给出了若干范例。

无论是那种级别的权限,只要有一个级别允许了,访问就能成功,这样是合理的,比如说我只想让一个用户访问一个数据库中的一个表,那么在全局和数据库级访问权限肯定是N,只有在表级是Y。如果一个用户在全局是Y,那么不管他在数据库级和表级是不是Y,他都会访问成功。因为只要在全局验证了Y,MYSQL就不再数据库级和表级进行验证。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23595918/viewspace-1035334/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23595918/viewspace-1035334/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习MySQL DBA需要一系列的步骤。首先,你需要了解MySQL的基础知识,包括数据库结构、SQL查询、数据库设计和数据库管理。其次,你需要学习如何使用MySQL的开发工具,学习如何安装和配置MySQL服务器以及其他实用工具。最后,你需要学习如何管理MySQL服务器,包括性能监控、安全管理和可用性管理。 ### 回答2: 学习MySQL DBA需要掌握以下几个方面: 1. 学习MySQL基础知识:包括MySQL的概念、体系结构、SQL语法等。可以通过阅读官方文档、参加培训课程或者学习在线教程来掌握。 2. 实践操作MySQL:通过在自己的电脑上安装MySQL,创建数据库、和查询数据等来熟悉MySQL的操作。可以使用一些开源项目或者模拟练习来加深对MySQL的理解。 3. 学习数据库设计:了解关系数据库的基本原理和规范化的概念,学习如何设计合理的数据库结构,包括的设计、字段的定义、主键和外键的关系等。 4. 学习MySQL性能调优:学习如何优化查询语句、索引的设计和使用,以及MySQL的参数调优等。可以通过查阅相关书籍、阅读MySQL官方性能调优手册、参与相关社区讨论来提高性能方面的知识。 5. 学习MySQL的备份和恢复:了解MySQL的备份和恢复策略,学习如何进行数据的备份和恢复,以及如何保证数据的安全性和完整性。 6. 学习高可用和容灾方案:了解MySQL的高可用性和容灾方案,学习如何搭建主从复制、集群、备份恢复等架构,以确保系统的稳定性和可用性。 7. 持续学习和实践:MySQL是一个不断发展和更新的数据库系统,所以需要持续学习并了解最新的版本和特性。同时,通过实践和解决实际问题来提升自己的技能和经验。 总之,学习MySQL DBA需要坚持不断学习和实践,通过理论与实践相结合来提升自己的技能水平。记得保持耐心和专注,因为这是一个相对复杂的领域。 ### 回答3: 学习MySQL数据库管理(MySQL DBA)需要掌握一定的数据库基础知识和相关技术。以下是学习MySQL DBA的步骤和建议: 1. 学习数据库基础知识:深入学习关系数据库的基本概念、SQL语言和数据库设计原则,了解数据库管理系统(如MySQL)的特点和功能。 2. 学习MySQL的特定知识:掌握MySQL的基本架构、配置文件、存储引擎等方面的知识,以及MySQL命令行和图形界面工具的使用方法。 3. 实践经验:通过实际操作和练习来加深对MySQL的理解。可以在本地安装MySQL,创建数据库、,执行SQL查询语句,并进行数据库的备份和恢复等操作。 4. 深入了解性能优化:掌握MySQL的性能调优技术,如索引优化、查询优化、缓存配置、硬件调整等,以提高数据库的性能和响应速度。 5. 学习备份和恢复策略:了解MySQL的备份和恢复方法,包括物理备份(如mysqldump)和逻辑备份(如mysqlbinlog),并熟悉如何应对数据库故障和数据丢失的情况。 6. 学习数据库安全性:了解MySQL数据库的安全配置和授权管理,以及如何保护数据库的安全性,如设置密码策略、访问控制等。 7. 参考学习资源:可以阅读相关的MySQL官方文档、书籍和在线教程,还可以参加专业的培训课程或参与技术社区的讨论,与其他DBA进行交流与学习。 8. 实践项目经验:参与数据库项目的开发和运维,通过实践解决实际问题,不断提升数据库管理技能。 总之,学习MySQL DBA需要通过持续学习和实践,了解数据库的基本原理和技术,并熟悉MySQL的特定知识和工具的使用。通过不断积累经验和解决问题,将能够成为一名高级的MySQL DBA。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值