Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246928
  • 博文数量: 40
  • 博客积分: 713
  • 博客等级: 军士长
  • 技术积分: 437
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-06 19:16
个人简介

努力不一定成功但放弃就一定失败

文章分类

全部博文(40)

文章存档

2012年(32)

2011年(8)

分类: Mysql/postgreSQL

2012-10-26 10:26:04

在学习的时候对mysql权限忙乱,网上看到了这篇文章,觉着很好和大家分享。

转载声明:本文的前两个大标题的内容是节选自阿里巴巴的数据库架构师简朝阳先生的《MySQL性能调优与架构设计》一书的“MySQL安全管理”一章。本文后两个大标题是节选自ITPUB的文章《深入学习MySQL授权表》。在此向二位的版权作出声明,本文仅是引用,不涉及任何商业目的。本着分享学习的心态,与大家共享美文。若有侵犯以上二位权利的地方,请及时与我联系。再次感谢以上文章的分享精神。并着重感谢阿里巴巴简朝阳先生,他写的书让我受益匪浅,并对简朝阳先生的分享精神表示敬佩。

论坛中,有人问关于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 leveldatabase 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两种,主要针对procedurefunction

典型的赋权语句是grant execute on test.proc1 to ‘me’@’localhost’

除了上面的几类权限外,还有一个和特殊的权限---赋予权限的权限(GRANT)。也有GRANT权限的用户可以给其他用户授予权限。典型的赋权语句是grant all on test.* to ‘me’@’localhost’WITH GRANT OPTION;

 三.MySQL服务器的访问控制实现原理

  现在让我们来看看MySQL服务器是如何通过用户特权来控制用户访问的。虽然这乍听起来好像挺吓人的,但是通过一个例子的演示,您就会发现其实事情没有我们想象的那么难以理解。

  首先,对用户的访问进行控制的时候,系统需要查看作为过滤器的一些授权表,这些表的使用过程是从一般到特殊,这些表包括:

  • User
  • Db
  • Host
  • Tables_priv 
  • Columns_priv 

  此外,一旦连接到了服务器,一个用户可以使用两种类型的请求:

  • 管理请求(shutdown,reload,等)
  • 数据库相关的请求(insertdelete,等)

  当用户提交管理请求时,服务器只需查看user表,这是因为user表是唯一包含与管理工作有关的权限的一个表。然而,当用户提交数据库请求时,要查看的表就要更多了

  您可能已经注意到了,这些授权表的内容好像有些重复,例如user表中有select权限,同时hostuser表中也有同样的权限。但是,这样做自有其道理。我们可以考虑一下user表中全局性的与数据库相关的权限,也就是说,在这个表中授予用户的权限对服务器上的所有数据库都有效。这些权限可以被认为是超级用户权限。相反,包含在hostdb表之内的与数据库相关的权限则是特定于主机或者数据库的。因此,让这个表内所有的权限保持为“N”不失为一个明智的选择。

  让我们假定我们的userdb表如下所示:

<

 

 

User Table

Host

%

User

Wj

Password

34ghyt

Select_priv

N

Insert_priv

Y

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