下面的例子显示出各种user 表中Host 和User 条目的值的组合如何应用于到来的连接: Host 值User 值被条目匹配的连接thomas.loc.gov fred fred ,从thomas.loc.gov 连接thomas.loc.gov 任何用户,从thomas.loc.gov 连接% fred fred ,从任何主机连接% 任何用户,从任何主机连接%.loc.gov fred fred ,从在loc.gov 域的任何主机连接x.y.% fred fred ,从x.y.net 、x.y.com ,x.y.edu 等联接。(这或许无用)144.155.166.177 fred fred ,从有144.155.166.177 IP地址的主机连接144.155.166.% fred fred ,从144.155.166 C类子网的任何主机连接
既然你能在Host 字段使用IP通配符值(例如,144.155.166.% 匹配在一个子网上的每台主机),有可能某人可能企图探究这种能力,通过命名一台主机为144.155.166.somewhere.com 。为了阻止这样的企图,MySQL不允许匹配以数字和一个点起始的主机名,这样,如果你用一个命名为类似1.2.foo.com 的主机,它的名字决不会匹配授权表中Host 列。只有一个IP数字能匹配IP通配符值。
一个到来的连接可以被在user 表中的超过一个条目匹配。例如,一个由fred 从thomas.loc.gov 的连接匹配多个条目如上所述。如果超过一个匹配,服务器怎么选择使用哪个条目呢?服务器在启动时读入user 表后通过排序来解决这个问题,然后当一个用户试图连接时,以排序的顺序浏览条目,第一个匹配的条目被使用。
user 表排序工作如下,假定user 表看起来像这样:
+-----------+----------+-|Host|User|...+-----------+----------+-|%|root|...|%|jeffrey|...|localhost|root|...|localhost||...+-----------+----------+-
当服务器在表中读取时,它以最特定的Host 值为先的次序排列(% 在Host 列里意味着“任何主机”并且是最不特定的)。有相同Host 值的条目以最特定的User 值为先的次序排列(一个空白User 值意味着“任何用户”并且是最不特定的)。最终排序的user 表看起来像这样: +-----------+----------+-|Host|User|...+-----------+----------+-|localhost|root|...|localhost||...|%|jeffrey|...|%|root|...+-----------+----------+-
当一个连接被尝试时,服务器浏览排序的条目并使用找到的第一个匹配。对于由jeffrey 从localhost 的一个连接,在Host 列的localhost 条目首先匹配。那些有空白用户名的条目匹配连接的主机名和用户名。(%/jeffrey 条目也将匹配,但是它不是在表中的第一匹配。)
(编辑:aniston)
|