10.3.1 权限系统的工作方式

10.3.1 权限系统的工作方式

MySQL的权限系统围绕着两个一般概念。

➢ 验证。确定用户是否允许连接服务器。

➢ 授权。确定用户是否拥有足够的权限执行查询请求。

如果验证不成功,授权就无法进行,所以可以认为此过程分为两个阶段。

1.访问控制的两个阶段

一般的权限控制过程分为两个不同的阶段:连接验证和请求验证。这两个阶段共分5个不同步骤来完成。

(1) MySQL使用user表的内容来确定应当接受还是拒绝进入的连接。这是通过将指定主机和用户与user表中包含的记录进行匹配完成的。MySQL还确定用户是否需要安全连接,是否超出了该账户所允许的每小时最大连接数。执行完步骤(1),权限控制过程的验证阶段就结束了。

(2) 步骤(2)开始权限控制过程的授权阶段。如果连接被接受,MySQL就验证是否超出了该账户每小时允许的最大查询或更新数。接下来,检查user表中授予的相应权限。如果启用了任何一种权限(设置为y),用户则有对所有数据库的全局权限,可以按照该权限授权的功能进行操作。当然,在大多数情况下,所有权限都是禁用的,这就会发生步骤(3)。

(3) 检查db表,验证允许该用户与哪些数据库交互。此表中启用的任何相应权限对应于允许此用户交互的数据库中的所有表。如果没有启用任何权限,则会跳到步骤(5)执行。如果找到一个匹配用户,但没有对应的主机值,则继续执行步骤(4)。

(4) 如果db表中存在一条与该用户匹配的记录,但主机值为空,就检查host表。如果找到匹配的主机值,则用户对host表中指示的数据库(而不是db表中的数据库)有相应权限。这就允许对特定数据库实现特定于主机的访问。

(5) 最后,如果用户试图执行未在user、db或host表中授权的命令,就要检查tables_priv和columns_priv表,确定该用户是否能够对所需的表或列执行该命令。

从上面的分解过程中可以看出,系统按从非常宽泛到非常特殊的顺序检查权限。下面考虑一个具体的示例。

2.跟踪一个真实的连接请求

假设用户jason,他与名为internal .example.com的客户端连接,使用secret密码。他想要向在company数据库中找到的widgets表插入一个新行。MySQL首先确保jason是否有连接数据库的授权,若是,再确定是否允许执行INSERT请求。

(1) 用户jason@internal.example.com是否需要安全连接?若是,且用户jason@internal.example.com没有提供必需的安全证书就尝试连接,则拒绝请求并结束验证过程。否则,转向步骤(2)。

(2) 如果运行的是MySQL 4.0.2或更高版本,则确定jason账户是否超出了每小时允许的最大连接数,若是,则拒绝验证过程。否则,且运行的是MySQL 5.0.3或更高版本,MySQL则确定是否超出了最大并发连接数。如果这两项任务都顺利通过,则进行步骤(3)。否则,拒绝请求。

(3) 用户jason@internal .example.com是否拥有连接数据库服务器的必要权限?若是,则转向步骤(4)。否则,拒绝访问。完成这个步骤后,权限控制机制中的验证部分就结束了。

(4) 用户jason@internal .example。com是否超出了允许的最大更新或查询数?如果没有,转向步骤(5)。否则,拒绝访问。

(5) 用户jason@internal .example.com是否拥有全局INSERT权限?若是,则接受并执行插入请求。否则,转向步骤(6)。

(6) 用户jason@internal.example.com是否拥有对company数据库的INSERT权限?若是,则接受并执行插入请求。否则,转向步骤(7)。

(7) 用户jason@internal .example.com对插入请求中指定的widget表列是否拥有INSERT权限?若是,则接受并执行插入请求。否则,拒绝请求并结束控制过程。

现在应该已经了解了MySQL访问控制机制的一般概念。但是,只有熟悉此过程的技术细节,这样理解才是全面的。下面将介绍这些技术。