WEB开发网
开发学院数据库MSSQL Server MySQL中文参考手册7(MySQL存取权限系统)grant设置... 阅读

MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password

 2007-11-11 11:38:16 来源:WEB开发网   
核心提示: 非空白Password值代表加密的口令, MySQL(和PHP搭配之最佳组合)不以任何人可以看的纯文本格式存储口令,MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password(5),相反,正在试图联接的一个用户提供的口令被加密(使用PASSWORD()函数),在范围字段的值可以如下被指定:

非空白Password值代表加密的口令。 MySQL(和PHP搭配之最佳组合)不以任何人可以看的纯文本格式存储口令,相反,正在试图联接的一个用户提供的口令被加密(使用PASSWORD()函数),并且与存储了user表中的已经加密的版本比较。如果他们匹配,口令是正确的。 

下面的例子显示出各种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(和PHP搭配之最佳组合)不允许匹配以数字和一个点起始的主机名,这样,如果你用一个命名为类似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'条目也将匹配,但是它不是在表中的第一匹配。)

这是另外一个例子。假定user表看起来像这样: 

+----------------+----------+-
| Host      | User   | ...
+----------------+----------+-
| %       | jeffrey | ...
| thomas.loc.gov |     | ...
+----------------+----------+-

排序后的表看起来像这样: 

+----------------+----------+-
| Host      | User   | ...
+----------------+----------+-
| thomas.loc.gov |     | ...
| %       | jeffrey | ...
+----------------+----------+-

一个由jeffrey从thomas.loc.gov的连接被第一个条目匹配,而一个由jeffrey从whitehouse.gov的连接被第二个匹配。 

普遍的误解是认为,对一个给定的用户名,当服务器试图对连接寻找匹配时,明确命名那个用户的所有条目将首先被使用。这明显不是事实。先前的例子说明了这点,在那里一个由jeffrey从thomas.loc.gov的连接没被包含'jeffrey'作为User字段值的条目匹配,但是由没有用户名的题目匹配! 

如果你有服务器连接的问题,打印出user表并且手工排序它看看第一个匹配在哪儿进行。 

6.8 存取控制,阶段2:请求证实
一旦你建立了一个连接,服务器进入阶段2。对在此连接上进来的每个请求,服务器检查你是否有足够的权限来执行它,它基于你希望执行的操作类型。这正是在授权表中的权限字段发挥作用的地方。这些权限可以来子user、db、host、tables_priv或columns_priv表的任何一个。授权表用GRANT和REVOKE命令操作。见7.26 GRANT和REVOKE 句法。(你可以发觉参考6.6 权限系统怎样工作很有帮助,它列出了在每个权限表中呈现的字段。)

user表在一个全局基础上授予赋予你的权限,该权限不管当前的数据库是什么均适用。例如,如果user表授予你delete权限, 你可以删除在服务器主机上从任何数据库删除行!换句话说,user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user表中的权限设成'N'并且仅在一个特定数据库的基础上授权, 使用db和host表。 

db和host表授予数据库特定的权限。在范围字段的值可以如下被指定: 


  • 通配符字符“%”和“_”可被用于两个表的Host和Db字段。 
  • 在db表的'%'Host值意味着“任何主机”,在db表中一个空白Host值意味着“对进一步的信息咨询host表”。 
  • 在host表的一个'%'或空白Host值意味着“任何主机”。 
  • 在两个表中的一个'%'或空白Db值意味着“任何数据库”。 
  • 在两个表中的一个空白User值匹配匿名用户。 


db和host表在服务器启动时被读取和排序(同时它读user表)。db表在Host、Db和User范围字段上排序,并且host表在Host和Db范围字段上排序。对于user表,排序首先放置最特定的值然后最后最不特定的值,并且当服务器寻找匹配入条目时,它使用它找到的第一个匹配。 

tables_priv和columns_priv表授予表和列特定的权限。在范围字段的值可以如下被指定: 


  • 通配符“%”和“_”可用在使用在两个表的Host字段。 
  • 在两个表中的一个'%'或空白Host意味着“任何主机”。 
  • 在两个表中的Db、Table_name和Column_name字段不能包含通配符或空白。 

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:MySQL 参考

编辑录入:coldstar [复制链接] [打 印]
赞助商链接