本节书摘来自异步社区《PHP、MySQL和Apache入门经典(第5版)》一书中的第2章,第2.8节,作者【美】Julie C. Meloni,更多章节内容可以访问云栖社区“异步社区”公众号查看
PHP、MySQL和Apache入门经典(第5版)
MySQL权限系统总是起作用的。当你第一次尝试连接MySQL服务器的时候,并且对于每一个后续的动作,MySQL都会检查以下3件事情。
正如你所了解的,在身份验证过程中,MySQL检查3件事情。和这3件事情相关的动作分如下两步执行。
1.MySQL查看你的连接所来自的主机,以及所使用的用户名和密码。如果主机允许连接,你的用户名对应的密码正确,并且用户名和分配给该主机的一个用户名匹配,MySQL就转到第二步。
2.对于你尝试执行的任何一条SQL命令,MySQL验证你能够对该数据库、表和字段执行此操作。如果步骤1失败,你将会看到一个相关的错误,并且不能继续步骤2。例如,假设你使用一个用户名joe和一个密码abc123连接到MySQL,并且想要访问一个名为myDB的数据库。如果由于如下原因导致这些连接变量的任何一个不正确,你都会接收到一条类似如下的错误消息。
密码不正确。
如果带有密码abc123的用户joe允许从localhost连接到myDB数据库,MySQL将会在这个过程的第二个步骤中检查joe所能执行的操作。为了便于说明,假设jow允许查询数据但是不允许插入数据。事件和错误的序列就会如下所示。
基于操作的许可在具有多层级管理的应用程序中很常见。例如,如果已经创建了包含个人财务数据的应用程序,你必须确保对记账级别的成员只赋予SELECT权限,而对具有安全许可的主管级成员赋予INSERT和DELETE权限。
在大多数情况下,当你通过一个Internet服务提供商访问MySQL的时候,只有一个用户和一个数据库可供使用。默认情况下,一个用户将能够访问该数据库中所有的表,并且允许执行所有的命令。在这种情况下,作为开发者,你的职责就是通过自己的编程开发出一个安全的应用程序。
然而,如果你是自己的服务器的管理员,或者Internet服务提供商允许你任意添加多个数据库和用户,并且可以修改自己的用户的访问权限,下面几个小节将带你学习如何做到这些。
通过一个第三方应用程序来管理服务器,这为你提供了一个简单的方法来添加用户,只要使用一个类似向导的过程或一个图形化界面。然而,通过MySQL监视器添加用户并不难,尤其是如果你理解了MySQL所使用的安全检查点,这我们刚才已经学习过。
添加新用户的最简单的方法就是使用GRANT命令。作为root用户连接到MySQL,我们就可以使用一条命令来建立一个新用户。另一种方法是使用INSERT语句修改mysql数据库中所有相关的表,这需要我们知道用来存储许可的表的所有字段。第二种方法的效果和GRANT命令相同,但是比GRANT命令复杂得多。GRANT命令的简单语法如下。
下面是我们可以授予的一些常见的权限。如果需要完整的权限列表,请参考位于http://dev.mysql.com/doc/refman/5.5/en/grant.html的MySQL手册的GRANT条目。
注意两个通配符和%的使用。这两个通配符用来代替值。在这个例子中,代替了数据库的全部表,而%代替了已知的世界中的所有主机的列表,这实际上是非常长的一个列表。
这里还有使用GRANT命令添加用户的另外一个例子。这次是添加一个带有密码45sdg11的用户jane,他在名为myCompany的数据库的一个名为employees的表上具有ALL权限。这个新的用户只能从一个特定的主机连接。
如果你知道janescomputer.company.com有一个IP地址63.124.45.2,可以用这个地址来替代命令中的主机名部分,命令如下所示。
添加用户的时候需要注意一点:总是使用密码并且确保这个密码是不易被破解的。
如果你使用GRANT命令来添加用户,改变会立即生效。要绝对确保这一点,你可以在MySQL监视器中使用一条FLUSH PRIVILEGES命令来重新载入授权表。
移除权限和添加权限一样简单,只不过是使用REVOKE命令,而不是使用GRANT命令。REVOKE命令的语法如下。
我们授权许可来使用INSERT命令,采用同样的方式,我们也可以通过使用DELETE命令从mysql数据库的表中删除记录,从而取消前面的授权许可。然而,这需要你熟悉字段和表,并且使用REVOKE命令会更容易和安全。
要把用户john向myCompany数据库中的INSERT能力收回,可以使用如下一条REVOKE语句。
REVOKE INSERE
ON myCompany.*
FROM john@hostname
对权限表中的数据的修改会立刻生效,但是,为了让服务器立刻意识到你的修改,在MySQL监视器中可以使用FLUSH PRIVILEGES命令。