Mysql教程

15.3 权限管理

权限管理主要是对登录到数据库的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中。数据库管理员要对权限进行管理。合理的权限管理能够保证数据库 系统的安全,不合理的权限设置可能会给数据库系统带来意想不到的危害。本节将为读者介绍权限管理的内容。

15.3.1  MySQL的各种权限

MySQL数据库中有很多种类的权限,这些权限都存储在mysql数据库下的权限表屮。 其中,user表中的权限种类最多。本小节将为读者介绍MySQL中的各种权限。

下表列出了MySQL的各种权限、user表中对应的列和权限的对象等信息。

权限名称 对应user表中的列 权限的范围
CREATE Create_priv 数据库、表或索引
DROP Drop_priv 数据库或表
GRANT OPTION Grant_priv 数据库、表、存储过程或函数
REFERENCES References_priv 数据库或表
ALTER Alter_priv 修改表
DELETE DeIete_priv 删除表
INDEX Index_priv 用索引查询表
INSERT Insert_priv 插入表
SELECT Select_priv 查询表
UPDATE Update_priv 更新表
CREATE VIEW Create_view_priv 创建视图
SHOW ViEW Show_view_priv 查看视图
ALTER ROUTINE Alter_routine_priv 修改存储过程或存储函数
CREATE ROUTINE Create_routine_priv 创建存储过程或存储函数
EXECUTE Execute_priv 执行存储过程或存储函数
EXECUTE Execute_priv 执行存储过程或存储函数
FILE File_priv 加载服务器主机上的文件
CREATE TEMPORARY TABLES Create_tmp_table_priv 创建临时表
LOCK TABLES Lock_tables_priv 锁定表
CREATE USER Create_user_priv 创建用户
PROCESS Process_priv 服务器管理
RELOAD Reload_priv 重新加载权限表
REPLICATION CLIENT Repl_client_priv 服务器管理
REPLICATION SLAVE Repl_slave_priv 服务器管理
SHOW DATABASES Show_db_priv 查看数据库
SHUTDOWN Shutdown_priv 关闭服务器
SUPER SUPER_priv 超级权限

上表中对user表中的各个字段及权限进行了介绍。通过权限设置,用户可以拥有不同的权限。拥有GRANT权限的用户可以为其用户设置权限。REVOKE权限的用户可以收回自己设置的权限。合理的设置权限能够保证MySQL数据库的安全。

15.3.2  授权

授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和 表的权限。合理的授权能够保证数据库的安全。不合理的授权会使数据库存在安全隐患。 MySQL中使用GRANT关键字来为用户设置权限。本小节将为读者介绍授权的方法。

MySQL中,必须拥有GRANT权限的用户才可以执行GRANT语句。GRANT语句的基本语法如下:

GRANT priv_type [(column_list)] ON database.table
TO user [ IDENTIFIED BY [PASSWORD] 'password']
[,user [ IDENTIFIED BY [PASSWORD] 'password']]...
with_option [with_option] ...]

其中,priv_type参数表示权限的类型;column_list参数表示权限作用于哪些列上,没有该参数时作用于整个表上;user参数由用户名和主机名构成,形式是“'username'@ ’hostname'”;IDENTIFIED BY参数用来为用户设置密码;password参数是用户的新密码。

WITH关键字后面带有一个或多个with_option参数。这个参数有5个选项,详细介绍如下:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;

  • MAX_QUERIES_PER_HOURcount:设置每个小时可以允许执行count次查询;

  • MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行count次更新;

  • MAX CONNECTIONS_PER HOURcount:设置每小时可以建立count连接;

  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数。

【示例15-17】下面使用GRANT命令来创建一个新的用户'test5'。'test5'对所有数据库有SELECT和UPDATE的权限。密码设置为'test5',而且加上WITH GRANT OPTION子句。GRANT语句的代码如下:

GRANT SELECT, UPDATE ON *.*
TO 'test5'@'localhost' IDENTIFIED BY 'test5'
WITH GRANT OPTION;

这些代码执行结果如下:

mysql> GRANT SELECT, UPDATE ON *.*
-> TO 'test5'@'localhost' IDENTIFIED BY 'test5'
-> WITH GRANT OPTION ;
Query OK, 0 rows affected (0.00 sec)

结果显示,GRANT语句执行成功。可以使用SELECT语句来查询user表,以查看test5用户的信息。SELECT语句执行结果如下:

mysql> SELECT Host,User,Password,Select_priv,Update_priv,Grant_priv FROM user WHERE user='test5'\G
****************************1.row***************************
Host: localhost
User test5
Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6
Se!ect_priv: Y
Update_priv: Y
Grant_priv: Y
1 row in set (0.00 sec)

查询结果显示,User值为test5;Select_priv,Update_priv和Grant_priv的值为Y;Password值为加密后的值。

【示例15-18】下面使用test5用户登录,然后GRANT命令来为用户test3设置权限。设置test6用户对mysql数据库有SELECT权限。GRANT语句的代码如下:

GRANT SELECT ON mysql.*
TO 'test3'@'localhost';

这些代码执行结果如下:

mysql> GRANT SELECT ON mysql.*
-> TO 'test3'@'localhost';
Query OK, 0 rows affected (0.00 sec)

结果显示,GRANT语句执行成功。使用SELECT语句查看test3用户的信息。SELECT语句执行结果如下:

mysql> SELECT Host,User,Password,Select_priv FROM mysql.user WHERE user='test3' \G
*********************************1.row************************
Host: localhost
User: test3
Password: *A8BE55A78C83239B88A218DEE9C26D1A6A137A51
Select_priv: Y
1 row in set (0.00 sec)

查询结果显示,User值为test3; Select_priv的值为Y。这说明test5用户可以将自己的权限赋给别的用户。原因是WITH GRANT OPTION子句可以使test5用户具有GRANT权 限。test5用户可以使用GRANT语句将自己的权限授权给别的用户。

15.3.3收回权限

收回权限就是取消某个用户的某些权限。例如,如果数据库管理员觉得某个用户不应该拥有DELETE权限,那么就可以将DELETE权限收回。收回权限的方式可以保证数据库的安全。MySQL中使用REVOKE关键字来为用户设置权限。收回指定权限的REVOKE语句的基本语法如下:

REVOKE priv_type [(column_list)]...
ON database.table
FROM user [,user]...

REVOKE语句中的参数与GRANT语句的参数意思相同。其中,priv_type参数表示权限的类型;column_list参数表示权限作用于哪些列上,没有该参数时作用于整个表上;user参数由用户名和主机名构成,形式是“’usemame’@'hostname’”。 收回全部权限的REVOKE语句的基本语法如下:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user]...

【示例15-19】下面收回test5用户的UPDATE权限。REVOKE语句的代码如下:

REVOKE UPDATE ON *.*
FROM 'test5'@'localhost';

这些代码执行结果如下:

mysql> REVOKE UPDATE ON *.*
->FROM 'test5'@'localhost';
Query OK, 0 rows affected (0.00 sec)

结果显示,REVOKE语句执行成功。使用SELECT语句查看test5用户的UPDATE权 限。SELECT语句执行结果如下:

mysql> SELECT Host,User,Password,Update_priv FROM mysql.user WHERE user='test5' \G
*************************1.row*********************
Host: localhost
User: test5
Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6
Update_priv: N
1 row in set (0.00 sec)

查询结果显示,Update_priv的值为N。

【示例15-20】下面收回test5用户的所有权限。REVOKE语句的代码如下:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test5'@'localhost';

这些代码执行结果如下:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test5'@'localhost';
Query OK, 0 rows affected (0.06 sec)

结果显示,REVOKE语句执行成功。使用SELECT语句查看test4用户的SELECT权限、UPDATE权限和GRANT权限。SELECT语句执行结果如下:

mysql> SELECT Host,User,Password,Select_priv,Update_priv,Grant_priv -> FROM mysql.user WHERE user='test5' \G
****************1.row*************************
Host: localhost
User: test5
Password: *30B3620A8C3D75549E8B7F077424EF88B6C798E6
Select_priv: N
Update_priv: N Grant_priv: N
1 row in set (0.00 sec)

结果显示,Select_priv,Updatejpriv和Grant_priv的值都为N。

技巧:数据库管理员给普通用户授权时一定要特别小心,如果授权不当,可能会给数据库带来致命的破坏。一旦发现给用户的授权太多,应该尽快使用REVOKE语句将权限收回。此处特别注意,最好不要授予普通用户SUPER权限、GRANT权限。

15.3.4 查看权限

在MySQL中,可以使用SELECT语句来查询user表中各用户的权限,也可以直接使用SHOW GRANTS语句来查看权限。mysql数据库下的user表中存储着用户的基本权限,可以使用SELECT语句来查看。SELECT语句的代码如下:

SELECT * FROM mysql.user;

要执行该语句,必须拥有对user表的查询权限。除了使用SELECT语句以外,还可以使用SHOW GRANTS语句来查看权限。SHOW GRANTS语句的代码如下:

SHOW GRANTS FOR 'username'@ 'hostname';

其中,username参数表示用户名;hostname参数表示主机名或者主机。

【示例15-21】下面查看root用户的权限。代码如下:

SHOW GRANTS FOR 'root'@'localhost';

这些代码执行结果如下:

mysql> SHOW GRANTS FOR 'root'@'localhost' \G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*348F870E4E4ADE95D0
72D3699C6CB6D89F2620F2' WITH GRANT OPTION
1 row in set (0.02 sec)

结果显示授权语句,从授权语句可以看出root的用户拥有的权限。


关注微信获取最新动态