努力不一定成功但放弃就一定失败
分类: mysql/postgresql
2012-10-26 10:26:04
论坛中,有人问关于mysql的权限方面的问题,在这里有必要对这部分内容做一个详细的介绍。
一.权限系统简介
mysql的权限系统相对来说并不复杂。权限信息都存储在grant tables系统表中,分别是
mysql.user
mysql.db
mysql.host
mysql.table_priv
mysql.column_priv
二.权限级别
mysql的权限共分为5个级别,分别是
1.global level
global level的权限控制又称为全局权限控制,所有权限信息都保存在mysql.user表中。global level的所有权限都是针对整个mysqld的,对数据库下的所有表和字段都有效。而不是针对某个特定数据库设置的,所以这个表中没有database这个字段。
针对某个数据库赋予global权限,那么查询global权限的时候显示的是n,而不是y。比如grant all on test.* to ‘me’@’localhost’,那么检查权限的时候(select * from mysql.user where user=’me’ and host=’localhost’),结果显示都是n。而如果赋权语句改为grant all on *.* to ‘me’@’localhost’,则会显示都是y了。这足以直观的展示global level的特性和作用了。global level会覆盖下面的四个级别的设置,前提是设置为y,而不是n。
database level
database level 是在global level之下,其他三个level之上的级别,其作用域即为指定整个数据库中的所有对象。与global level相比,这个级别少了几个权限,database level虽然会被global level覆盖,但它也有能力覆盖下面的三个级别的设置,前提是y,而不是n。
典型的database level级别的赋权语句是grant all on test.* to ‘me’@’localhost;
table level
table level 权限是database level之下的级别,它会被global level和database level 覆盖,但它同样也有能力覆盖下面的两个级别。
典型的赋权语句是grant all on test.yourtable to ‘me’@’localhost’
column level
column level仅仅是对某个表的指定的列设置权限。它同样可以被其上的级别覆盖,但不会覆盖其下的routine level级别,因为它与routine level没有权限重合。
典型的赋权语句是grant select(name,age) on test.users to ‘me’@’localhost’
routine level
routine level权限只有execute 和 alter routine两种,主要针对procedure和function。
典型的赋权语句是grant execute on test.proc1 to ‘me’@’localhost’
除了上面的几类权限外,还有一个和特殊的权限---赋予权限的权限(grant)。也有grant权限的用户可以给其他用户授予权限。典型的赋权语句是grant all on test.* to ‘me’@’localhost’with grant option;
三.mysql服务器的访问控制实现原理
现在让我们来看看mysql服务器是如何通过用户特权来控制用户访问的。虽然这乍听起来好像挺吓人的,但是通过一个例子的演示,您就会发现其实事情没有我们想象的那么难以理解。
首先,对用户的访问进行控制的时候,系统需要查看作为过滤器的一些授权表,这些表的使用过程是从一般到特殊,这些表包括:
此外,一旦连接到了服务器,一个用户可以使用两种类型的请求:
当用户提交管理请求时,服务器只需查看user表,这是因为user表是唯一包含与管理工作有关的权限的一个表。然而,当用户提交数据库请求时,要查看的表就要更多了。
您可能已经注意到了,这些授权表的内容好像有些重复,例如user表中有select权限,同时host和user表中也有同样的权限。但是,这样做自有其道理。我们可以考虑一下user表中全局性的与数据库相关的权限,也就是说,在这个表中授予用户的权限对服务器上的所有数据库都有效。这些权限可以被认为是超级用户权限。相反,包含在host和db表之内的与数据库相关的权限则是特定于主机或者数据库的。因此,让这个表内所有的权限保持为“n”不失为一个明智的选择。
让我们假定我们的user和db表如下所示:
<
|
|
user table | |
host | % |
user | wj |
password | 34ghyt |
select_priv | n |
insert_priv | y |