前言:
MySQL服务器的安全基础是:用户应该对他们的需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。
例如,我们可能有一下要求:
- 多数用户只能对表进行读和写,但少数用户甚至需要创建和删除表;
- 有些用户需要读表,但不能更新表;
- 有些用户可以往表里添加数据,但是他们不能删除表了的数据;
- 等等;
以上的只是例子,但是有助于说明一个事实,也就是你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。
平时我们在学习或测试mysql的时候可能用的都是root的账户,但是在现实世界的日常生活中,在正式的开发过程中,我们要做到,尽量不要使用root用户登录(更linux很像,root就是万能的),因为权限太多了!我们应该创建一系列账户,有的用于管理,有的供用户使用,有的供开发人员使用,等等。
管理用户
MYSQL用户账号和信息存储在名为mysql的数据库中,一般的,我们不需要直接访问mysql数据库和表。我们可以从mysql表中获得所有用户账号列表:
USE mysql;
SELECT user FROM user;
返回:
我们用图形界面可能会看得更清楚(这里我用的是Navicat for mysql):
mysql数据库中有个user表,它包含所有的用户账号,user表里面有一个名为user的列,它存储用户登录名,新安装的服务器可能只有一个用户(如这里只有一个root用户)。
在这里我们看到暂时我们只有一个root用户,接下来我们看看如何管理用户:
1、创建用户账号:
为了创建一个新的用户账号,使用CREATE USER语句:
CREATE USER lsgo IDENTIFIED BY '123456';
如上我创建了一个新用户 lsgo ,密码为 123456 ,在创建用户的时候不一定要指定密码(不指定的话则登录密码为空),不过这里用 IDENTIFIED BY 指定了用户密码。
如果你再次列出用户账号,就会看到我们已经创建用户成功了:
用户是我创建的,那么我肯定能够修改他的名字啊!重命名一个用户用 RENAME USER 语句:
RENAME USER lsgo TO zhongjin;
改过来了有木有?感觉挺有趣的。
2、删除用户账号:
删除用户用:
DROP USER zhongjin;
注意:MYSQL 5以来DROP USER删除用户账号和所有相关的账号权限,但是在MYSQL 5以前,DROP USER只能用来删除用户账号,不能删除相关权限。那么在使用旧版的MYSQL,需要先把要删除的用户的权限都删除掉后,再删除用户。如何管理用户权限?看下面。。。
3、设置访问权限:
在创建完用户之后,必须接着分配访问权限,新创建的用户账号是没有访问权限的,他们能够登录MYSQL,但是不能看到数据,不能执行任何数据库的操作。
为了能够看到赋予给用户的权限,可以使用SHOW GRANTS FOR语句:
SHOW GRANTS FOR zhongjin;
输出结果显示用户zhongjin有一个权限 USAGE ON .。USAGE其实表示“根本没有权限”(尽管这很不直观),因此,此结果表示在任意数据库和任意表上对任何东西没有权限(*表示任意,某个数据库的某个表用: 数据库名.表名)
还有 zhongjin@% 是什么鬼?用户名定义为 user@root MySQL的权限用用户名和主机名结合定义,如果不使用主机名,则使用默认的主机名 %(授予用户访问权限而不管主机名)。
为了给用户授予权限,我们可以用 GRANT 语句,GRANT要求你至少给出以下几点信息:
1. 要授予的权限;
2. 倍授予访问权限的数据库或表;
3. 用户名(给谁分配);
例子:
GRANT SELECT ON test.* TO zhongjin;
此GRANT允许用户在test.*(test数据库下的任意表上)使用SELECT。通过只授予SELECT访问权限,用户zhongjin对test数据库只有只读的访问权限。
SHOW GRANTS FOR zhongjin;
返回:
每个GRANT添加或更新用户的一个权限,但是怎么给用户取消某个权限呢?我们就要用到REVOKE语句了。REVOKE语句撤销特定的权限:
REVOKE SELECT ON test.* FROM zhongjin;
结果发现:
之前的SELECT权限没有了。证明REVOKE语句起作用了。
注意:被撤销的访问权限必须存在,否则会出错。
GRANT 和 REVOKE 可在几个层次上控制访问权限:
- 在整个服务器,使用 GRANT ALL 和 REVOKE ALL;
- 在整个数据库,使用 ON database.*;
- 特定的表,使用 ON database.table;
- 特定的列;
- 特定的存储过程。
可以管理的权限当然有一大堆,大家可以访问
http://blog.chinaunix.net/uid-167175-id-3472332.html
了解更多的权限列表。
4、更改用户密码:
为了更改用户的密码,可使用 SET PASSWORD 语句:
SET PASSWORD FOR zhongjin = Password('456789');
SET PASSWORD 更新用户密码,新密码必须传到Password()函数中进行加密。
SET PASSWORD 还可以用来设置你自己的密码:
SET PASSWORD = Password('123789');
在不指定用户名时,SET PASSWORD更新当前登录用户的密码。
其实吧,用户权限这个东西如果用代码来实现,还是比较麻烦的,毕竟真正开发起来,我们的数据表会很多,权限也是多种多样的。我们可以尝试用图形界面来管理这些用户及权限: