分类: Mysql/postgreSQL
2008-05-29 16:05:10
上表显示的第一组权限说明符适用于数据库、表和列。第二组说明符是管理特权。通常,这些权限的授予相当保守,因为它们会影响服务器的操作(例如, SHUTDOWN 特权不是按每天来分发的权限)。第三组说明符是特殊的。ALL的意思是“所有的权限”,而USAGE 的意思是“无权限”─即创建用户,但不授予任何的权限。
columns 权限适用的列。这是可选的,只来设置列专有的权限。如果命名多于一个列,则用逗号分开。
what 权限应用的级别。权限可以是全局的(适用于所有数据库和所有的表)、数据库专有的(适用于某个数据库中的所有表),或表专有的。可以通过指定一个C O L U M N S子句将权限授予特定的列。
user 使用权限的用户。它由用户名和主机名组成。在MySQL中,不仅指定谁进行连接,还要指定从哪里连接。它允许您拥有两个带有相同名字的、从不同位置连接的用户。MySQL允许在它们之间进行区别并相互独立地分配权限。
MySQL的用户名就是您在连接到服务器时指定的名字。该名字与您的UNIX 注册名或Windows 名的没有必然连系。缺省设置时,客户机程序将使用您注册的名字作为MySQL的用户名(如果您不明确指定一个名字的话),但这只是一个约定。有关将root作为可以操作一切MySQL的超级用户名也是这样,就是一种约定。您也可以在授权表中将此名修改成nobody,然后作为nobody 用户进行连接,以执行需要超级用户特权的操作。
password 分配给该用户的口令。这是可选的。如果您不给新用户指定IDENTIFIEDBY子句,该用户不分配口令(是非安全的)。对于已有的用户,任何指定的口令将替代旧口令。如果不指定新口令,用户的旧口令仍然保持不变。当您确实要使用ID E N T I F I E DBY 时,该口令串应该是直接量,GRANT 将对口令进行编码。当用SET PA S S W O R D语句时,不要使用PASSword() 函数。
WITH GRANT OPTION 子句是可选的。如果包含该子句,该用户可以将GRANT 语句授予的任何权限授予其他的用户。可以使用该子句将授权的能力授予其他的用户。
用户名、口令以及数据库和表的名称在授权表项中是区分大小写的,而主机名和列名则不是。
通过查询某些问题,通常可以推断出所需的GRANT 语句的类型:
谁可以进行连接,从哪里连接?
用户应具有什么级别的权限,这些权限适用于什么?
允许用户管理权限吗?
让我们来提问这些问题,同时看一些利用GRANT 语句设置MySQL用户账号的例子。
1. 谁可以进行连接,从哪里连接
您可以允许用户在特定的主机或涉及范围很宽的一组主机中进行连接。在一个极端,如果知道用户将仅从那个主机中进行连接,则可限定对单个主机的访问:
GRANT ALL ON samp_db.* TO boris@localhost IDENTFIEDBY "ruby"
GRANT ALL ON samp_db.* TO fred@ares.mars.net IDENTFIEDBY "quartz"
(符号samp_db.* 含义是“在samp_db 数据库中的所有表”)在另一个极端,您可能会有一个用户m a x,他周游世界并需要能够从世界各地的主机中进行连接。在这种情况下,无论他从哪里连接您都将允许:
GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"
‘%’字符起通配符的作用,与LIKE模式匹配的含义相同,在上个语句中,它的意思是“任何主机”。如果您根本不给出主机名部分,则它与指定“ %”的含义相同。因此, max和max@%是等价的。这是设置一个用户最容易的方法,但安全性最小。
要想采取妥协的办法,可允许用户在一组有限的主机中进行连接。例如,要使mary 从snake.net 域的任何主机中进行连接,可使用%.snake.net 主机说明符:
GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"
该用户标识符的主机部分可用IP 地址而不是主机名给出(如果愿意的话)。可以指定一个直接的IP 地址或包含模式字符的地址。同样,自MySQL3.23 起,可以用一个网络掩码来指定IP 号,网络掩码表明了用于该网络号的二进制位数:
GRANT ALL ON samp_db.* TO joe@192.168.0.3 IDENTIFIEDBY "water"
GRANT ALL ON samp_db.* TO ardis@192.168.128.% IDENTIFIEDBY "snow"
GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIEDBY "ice"
第一条语句指明用户可进行连接的特定的主机。第二条语句指定129.168.128 Class C 子网的IP 模式。在第三条语句中, 192.168.128.0/17 指定一个17 位二进制的网络号,并将任何主机与其IP 地址的前17 个二进制位中的192.168.128.0/17 进行匹配。
如果MySQL抱怨您指定的用户值,则可能需要使用引号(但对用户名和主机名分别加引号):
GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
2. 用户应具有什么级别的权限,这些权限适用于什么
您可授予不同级别的权限。全局权限的功能最强,因为它们适用于任何数据库。为了使ethel 成为可以进行一切操作的超级用户(其中包括可以对其他用户授权),发布下列语句:
GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee"
WITH GRANT OPTION
ON 子句中*.* 说明符的意思是“所有数据库,所有的表”,为保险起见,我们已经指定ethel 只能从本地主机中连接。限制超级用户从哪些主机上进行连接通常是明智的做法,因为它限制住了其他用户对口令进行试探。
有些权限( F I L E、P R O C E S S、RELOAD 和S H U T D O W N)是管理权限,只能用NO *.* 全局权限说明符来授予。如果希望的话,也可以不用授予数据库级的权限来授予这些权限。例如,下列语句建立了一个flush 用户,它除了发布FLUSH语句外不做其他任何事情。在管理脚本中这可能是有用的,因为需要在这些脚本中执行诸如在日志文件循环期间刷新日志的操作:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"
通常授予管理权限应该是保守的,因为具有这些权限的用户可能影响服务器的操作。
数据库级的权限适用于特定数据库中的所有表。这些权限使用ON db_name.* 子句进行授予:
GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock"
GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"
第一条语句将bill 的所有权限授予samp_db 数据库的任何表。第二条语句创建一个限制访问的用户r o _ user(只读用户),它可以访问menagerie 数据库的所有表,但只能读取。也就是说,该用户只能发布SELECT 语句。