共计 3532 个字符,预计需要花费 9 分钟才能阅读完成。
如何深入学习 MySQL 授权表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
我们将向读者详细介绍 MySQL 的授权表,并通过一些实例来讲解 MySQL 是如何提高这些授权表来实现用户访问控制的。我们首先介绍 MySQL 访问控制过程,然后说明 tables_priv 和 columns_priv 授权表,我们会给出与 MySQL 的 tables_priv 表有关的解释和范例。最后,我们介绍 columns_priv 授权表及其范例。
一、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 表如下所示:
下面简要介绍各字段的含义:
Host——适用于那些主机?
Db——适用于从上面的主机所连接的哪些数据库?
User——适用于来自上述主机的哪些用户?
Table_name——适用于上述数据库中的哪些表?
Table_priv——为这个表赋予哪些权限?
Column_priv——为这个表中的个字段赋予哪些权限?
Timestamp——这个权限是何时赋予的?
Grantor——谁授与该用户的这个权限?
要想真正弄懂 tables_priv 表,最好的办法就是通过实例进行学习,下面我们就给出一些例子。
例 1:
% GRANTSELECTON italy TO wj@314interactive.com;
这条命令的作用是什么? 以上命令允许来自主机 314interactive.com 的用户 wj 在表 italy 上至下一个 SELECT 语句。请记住,只有当给定数据库 / 主机和用户名对应的 db 或者 host 表中的 SELECT 字段的值为 N 时,才需要访问这个表。如果给定数据库 / 主机和用户名对应的 db 或者 host 表中的 SELECT 字段中有一个值为 Y 的话,那么就无需控制该 tables_priv 表。
例 2:
% GRANTSELECT, INSERTON oats.italy TO wj@314interactive.com;
这条命令的作用是什么? 以上命令允许来自主机 314interactive.com 的用户 wj 对数据库 oats 中的数据表 italy 执行 SELECT 和 INSERT 语句。
例 3:
% REVOKESELECTon oats.italy from wj@314interactive.com
这条命令的作用是什么? 以上命令撤消来自主机 314interactive.com 的用户 wj 对数据库 oats 中的表 italy 的执行 SELECT 的权限。
重要的是要认识到,包含在 tables_priv 中的信息仅当 host/db 表不允许用户执行要求的功能所需的权限时才生效。如果给定的权限在 host/db 表中为 Y,那么就无需考察 tables_priv 表。
例 4:
% GRANTSELECT(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:
% REVOKEUPDATE(address,phone) ON company.customers FROM gilmore@314interactive.com;
这条命令的作用是什么? 这个命令将撤消对 company 数据库中 customers 表内的 address 和 phone 字段执行 UPDATE 操作的权限。
这将带来哪些影响? 因为该命令直接涉及给定表中的某些字段,所以 columns_priv 表以及 tables_priv 表也会更新。
前面说过,只有在必须的情况下才会使用授权表,举例来说,如果高优先级的表提供了适当的权限的话,那么就无需查阅优先级较低的授权表了。如果高优先级的表中对应命令的值为 N,那么就需要进一步查看低优先级的授权表。
无论是那种级别的权限,只要有一个级别允许了,访问就能成功,这样是合理的,比如说我只想让一个用户访问一个数据库中的一个表,那么在全局和数据库级访问权限肯定是 N, 只有在表级是 Y。如果一个用户在全局是 Y,那么不管他在数据库级和表级是不是 Y,他都会访问成功。因为只要在全局验证了 Y,MYSQL 就不再数据库级和表级进行验证。
关于如何深入学习 MySQL 授权表问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。