Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104547377
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-26 09:18:32

 

作者:天极软件 来源:天极软件

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

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

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

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

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

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

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

tables_privcolumns_priv表在HostDbUser字段上被排序。这类似于db表的排序,尽管因为只有Host字段可以包含通配符,但排序更简单。

请求证实进程在下面描述。(如果你熟悉存取检查的源代码,你会注意到这里的描述与在代码使用的算法略有不同。描述等价于代码实际做的东西;它只是不同于使解释更简单。)

对管理请求(shutdownreload等等),服务器仅检查user表条目,因为那是唯一指定管理权限的表。如果条目许可请求的操作,存取被授权了,否则拒绝。例如,如果你想要执行mysqladmin shutdown,但是你的user表条目没有为你授予shutdown权限,存取甚至不用检查dbhost表就被拒绝。(因为他们不包含Shutdown_priv行列,没有这样做的必要。)

对数据库有关的请求(insertupdate等等),服务器首先通过查找user表条目来检查用户的全局(超级用户)权限。如果条目允许请求的操作,存取被授权。如果在user表中全局权限不够,服务器通过检查dbhost表确定特定的用户数据库权限:

  1. 服务器在db表的HostDbUser字段上查找一个匹配。 HostUser对应连接用户的主机名和MySQL用户名。Db字段对应用户想要存取的数据库。如果没有HostUser的条目,存取被拒绝。
  2. 如果db表中的条目有一个匹配而且它的Host字段不是空白的,该条目定义用户的数据库特定的权限。
  3. 如果匹配的db表的条目的Host字段是空白的,它表示host表列举主机应该被允许存取数据库的主机。在这种情况下,在host表中作进一步查找以发现HostDb字段上的匹配。如果没有host表条目匹配,存取被拒绝。如果有匹配,用户数据库特定的权限以在dbhost表的条目的权限,即在两个条目都是'Y'的权限的交集(而不是并集!)计算。(这样你可以授予在db表条目中的一般权限,然后用host表条目按一个主机一个主机为基础地有选择地限制它们。)

在确定了由dbhost表条目授予的数据库特定的权限后,服务器把他们加到由user表授予的全局权限中。如果结果允许请求的操作,存取被授权。否则,服务器检查在tables_privcolumns_priv表中的用户的表和列权限并把它们加到用户权限中。基于此结果允许或拒绝存取。

用布尔术语表示,前面关于一个用户权限如何计算的描述可以这样总结:

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

它可能不明显,为什么呢,如果全局user条目的权限最初发现对请求的操作不够,服务器以后把这些权限加到数据库、表和列的特定权限。原因是一个请求可能要求超过一种类型的权限。例如,如果你执行一个INSERT ... SELECT语句,你就都要insertselect权限。你的权限必须如此以便user表条目授予一个权限而db表条目授予另一个。在这种情况下,你有必要的权限执行请求,但是服务器不能自己把两个表区别开来;两个条目授予的权限必须组合起来。

host表能被用来维护一个“安全”服务器列表。在TcX,host表包含一个在本地的网络上所有的机器的表,这些被授予所有的权限。

你也可以使用host表指定不安全的主机。假定你有一台机器public.your.domain,它位于你不认为是安全的一个公共区域,你可以用下列的host表条目子允许除了那台机器外的网络上所有主机的存取:

+--------------------+----+-
| Host               | Db | ...
+--------------------+----+-
| public.your.domain | %  | ... (所有权限设为 'N')
| %.your.domain      | %  | ... (所有权限设为 'Y')
+--------------------+----+-

当然,你应该总是测试你在授权表中的条目(例如,使用mysqlaccess)让你确保你的存取权限实际上以你认为的方式被设置。

阅读(779) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~