访问控制
访问控制分为两个阶段:连接核实和请求核实
请求核实
一旦你建立了连接,服务器进入访问控制的阶段2。对在此连接上进来的每个请求,服务器检查你想执行什么操作,然后检查是否有足够的权限来执行它。这正是在授权表中的权限列发挥作用的地方。这些权限可以来自 user、db、host、tables_priv 或 columns_priv表。
user 表在全局基础上授予赋予你的权限,该权限不管当前的数据库是什么均适用。例如,如果 user 表授予你 DELETE 权限, 你可以删除在服务器主机上从任何数据库删除行!换句话说,user 表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在 user 表中的权限设成 ‘N’ 并且仅在特定数据库的基础上授权。你可以为特定的数据库、表或列授权。
db 表 和 host 表
db和host表授予数据库特定的权限。在这些表中的范围列的值可以采用以下方式:
- 通配符字符“%”并“”可用于两个表的 Host 和 Db 列。它们与用 LIKE操作符执行的模式匹配操作具有相同的含义。如果授权时你想使用某个字符,必须使用反斜现引用。例如,要想在数据库名中包括下划线(‘’),在GRANT语句中用‘_’来指定。
- 在db表的’%'Host值意味着“任何主机”,在db表中空Host值意味着“对进一步的信息咨询host表”。
- 在host表的 ‘%’ 或空 Host 值意味着“任何主机”。
- 在两个表中的 ‘%’ 或空 Db 值意味着“任何数据库”。
- 在两个表中的空 User 值匹配匿名用户。
db和host表在服务器启动时被读取并排序(同时它读user表)。db 表在 Host、Db和User 范围列上排序,host 表在 Host 和 Db 范围列上排序。对于user表,首先根据最具体的值最后根据最不具体的值排序,并且当服务器寻找匹配条目时,它使用它找到的第一匹配。
tables_priv 表 和 columns_priv 表
tables_priv 和 columns_priv 表授予表和列特定的权限。这些表的范围列的值可以如下被指定:
- 通配符“%”并“_”可用在使用在两个表的Host列。
- 在两个表中的’%'或空Host意味着“任何主机”。
- 在两个表中的Db、Table_name和Column_name列不能包含通配符或空。
tables_priv 和 columns_priv 表根据 Host、Db 和 User 列被排序。这类似于 db 表的排序,因为只有 Host 列可以包含通配符,排序更简单。
用户数据库权限
- 服务器在 db 表的 Host、Db 和 User 列上查找匹配。Host 和 User 对应连接用户的主机名和 MySQL 用户名。Db 列对应用户想要访问的数据库。如果没有 Host 和 User 的行,访问被拒绝。
- 如果 db 表中有匹配的行而且它的 Host 列不是空的,该行定义用户的数据库特定的权限。
- 如果匹配的 db 表的行的 Host 列是空的,它表示 host 表列举被允许访问数据库的主机。在这种情况下,在host表中作进一步查找以发现Host和Db列上的匹配。如果没有host表行匹配,访问被拒绝。如果有匹配,用户数据库特定的权限以在 db 和 host 表的行的权限,即在两个行都是’Y’的权限的交集(而不是并集!)计算。(这样你可以授予在 db 表行中的一般权限,然后用 host 表行按主机主机为基础有选择地限制它们。)
在确定了由 db 和 host 表行授予的数据库特定的权限后,服务器把他们加到由 user 表授予的全局权限中。如果结果允许请求的操作,访问被授权。否则,服务器检查在 tables_priv 和 columns_priv 表中的用户的表和列权限并把它们加到用户权限中。基于此结果允许或拒绝访问。
用布尔术语表示,前面关于用户权限如何计算的描述可以这样总结:
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
它可能不明显,为什么呢,如果全局 user 行的权限最初发现对请求的操作不够,服务器以后把这些权限加到数据库、表并列的特定权限。原因是请求可能要求超过一种类型的权限。例如,如果你执行INSERT INTO … SELECT语句,你就需要INSERT和SELECT权限。你的权限必须是user表行授予一个权限而db表行授予另一个权限。在这种情况下,你有必要的权限执行请求,但是服务器不能自己把两个表区别开来;两个行授予的权限必须组合起来。
host 表不受GRANT或REVOKE语句的影响,因此在大多数MySQL安装中没有使用。如果你直接修改它,你可以用于某种专门目的,例如用来维护安全服务器列表。例如,在TcX,host表包含在本地网络上所有的机器的表。这些表被授予所有的权限。