前言:

MySQL服务器的安全基础是:用户应该对他们的需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有过多的访问权。
例如,我们可能有一下要求:
- 多数用户只能对表进行读和写,但少数用户甚至需要创建和删除表;
- 有些用户需要读表,但不能更新表;
- 有些用户可以往表里添加数据,但是他们不能删除表了的数据;
- 等等;

以上的只是例子,但是有助于说明一个事实,也就是你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。

平时我们在学习或测试mysql的时候可能用的都是root的账户,但是在现实世界的日常生活中,在正式的开发过程中,我们要做到,尽量不要使用root用户登录(更linux很像,root就是万能的),因为权限太多了!我们应该创建一系列账户,有的用于管理,有的供用户使用,有的供开发人员使用,等等。

管理用户

MYSQL用户账号和信息存储在名为mysql的数据库中,一般的,我们不需要直接访问mysql数据库和表。我们可以从mysql表中获得所有用户账号列表:

USE mysql;
SELECT user FROM user;

返回:

mysql的管理员视图 mysql的用户管理与权限管理_mysql


我们用图形界面可能会看得更清楚(这里我用的是Navicat for mysql):

mysql的管理员视图 mysql的用户管理与权限管理_数据库_02

mysql数据库中有个user表,它包含所有的用户账号,user表里面有一个名为user的列,它存储用户登录名,新安装的服务器可能只有一个用户(如这里只有一个root用户)。

在这里我们看到暂时我们只有一个root用户,接下来我们看看如何管理用户:

1、创建用户账号:

为了创建一个新的用户账号,使用CREATE USER语句:

CREATE USER lsgo IDENTIFIED BY '123456';

如上我创建了一个新用户 lsgo ,密码为 123456 ,在创建用户的时候不一定要指定密码(不指定的话则登录密码为空),不过这里用 IDENTIFIED BY 指定了用户密码。

如果你再次列出用户账号,就会看到我们已经创建用户成功了:

mysql的管理员视图 mysql的用户管理与权限管理_mysql_03

用户是我创建的,那么我肯定能够修改他的名字啊!重命名一个用户用 RENAME USER 语句:

RENAME USER lsgo TO zhongjin;

mysql的管理员视图 mysql的用户管理与权限管理_mysql的管理员视图_04

改过来了有木有?感觉挺有趣的。

2、删除用户账号:

删除用户用:

DROP USER zhongjin;

注意:MYSQL 5以来DROP USER删除用户账号和所有相关的账号权限,但是在MYSQL 5以前,DROP USER只能用来删除用户账号,不能删除相关权限。那么在使用旧版的MYSQL,需要先把要删除的用户的权限都删除掉后,再删除用户。如何管理用户权限?看下面。。。

3、设置访问权限:

在创建完用户之后,必须接着分配访问权限,新创建的用户账号是没有访问权限的,他们能够登录MYSQL,但是不能看到数据,不能执行任何数据库的操作。

为了能够看到赋予给用户的权限,可以使用SHOW GRANTS FOR语句:

SHOW GRANTS FOR zhongjin;

mysql的管理员视图 mysql的用户管理与权限管理_数据库_05

输出结果显示用户zhongjin有一个权限 USAGE ON .。USAGE其实表示“根本没有权限”(尽管这很不直观),因此,此结果表示在任意数据库和任意表上对任何东西没有权限(*表示任意,某个数据库的某个表用: 数据库名.表名)

还有 zhongjin@% 是什么鬼?用户名定义为 user@root MySQL的权限用用户名和主机名结合定义,如果不使用主机名,则使用默认的主机名 %(授予用户访问权限而不管主机名)。

mysql的管理员视图 mysql的用户管理与权限管理_mysql的管理员视图_06

为了给用户授予权限,我们可以用 GRANT 语句,GRANT要求你至少给出以下几点信息:
1. 要授予的权限;
2. 倍授予访问权限的数据库或表;
3. 用户名(给谁分配);
例子:

GRANT SELECT ON test.* TO zhongjin;

此GRANT允许用户在test.*(test数据库下的任意表上)使用SELECT。通过只授予SELECT访问权限,用户zhongjin对test数据库只有只读的访问权限。

SHOW GRANTS FOR zhongjin;

返回:

mysql的管理员视图 mysql的用户管理与权限管理_mysql_07

每个GRANT添加或更新用户的一个权限,但是怎么给用户取消某个权限呢?我们就要用到REVOKE语句了。REVOKE语句撤销特定的权限:

REVOKE SELECT ON test.* FROM zhongjin;

结果发现:

mysql的管理员视图 mysql的用户管理与权限管理_mysql_08

之前的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更新当前登录用户的密码。

其实吧,用户权限这个东西如果用代码来实现,还是比较麻烦的,毕竟真正开发起来,我们的数据表会很多,权限也是多种多样的。我们可以尝试用图形界面来管理这些用户及权限:

mysql的管理员视图 mysql的用户管理与权限管理_用户账号_09


mysql的管理员视图 mysql的用户管理与权限管理_用户账号_10