文章目录
- MySQL权限
- 授予权限
- 查看权限
- 撤销权限
- 权限生效机制
- 访问控制的实现
在实际生产中,为了保证数据的安全,数据库管理人员需要为不同的操作人员分配不同的权限,限制登录MySQL服务器的用户只能在其权限范围内操作。同时管理员还可以根据不同的情况为用户授予权限或撤销权限,从而控制操作人员的权限。
MySQL权限
MySQL的权限系统分为以下三个不同的层级:
- 全局性的权限:针对整个mysql实例。
- 数据库级别的权限:针对某个具体的MySQL数据库。
- 对象级别的权限:针对MySQL数据库中某个具体的数据库对象,如:表、表中的列、存储过程和存储函数等。
MySQL中的权限信息根据其作用范围分别存储在名称为mysql的数据库的不同表中。当MySQL启动时会自动加载这些权限信息,并且将这些权限信息读取到内存中。
系统表名称 | 描述 |
---|---|
user | 保存用户账号信息和全局权限信息 |
db | 保存数据库级别的权限信息 |
tables_priv | 保存表级别的权限信息 |
columns_priv | 保存列级别的权限信息 |
procs_priv | 保存存储过程和存储函数相关的权限信息 |
proxies_priv | 保存代理用户的权限信息 |
查看用户的权限:
mysql> show grants for username@hostname;
MySQL权限可以分为数据权限、结构权限、管理权限。管理员可以为用户授予或撤销权限。
分类 | 权限名称 | 权限级别 | 描述 |
---|---|---|---|
数据权限 | INSERT | 全局、数据库、表、列 | 允许插入数据 |
数据权限 | DELETE | 全局、数据库、表 | 允许删除数据 |
数据权限 | UPDATE全局、数据库、表、列 | 允许更新数据 | |
数据权限 | SELECT | 全局、数据库、表、列 | 允许访问数据 |
数据权限 | SHOW DATABASES | 全局 | 允许查看已存在的数据库 |
数据权限 | SHOW VIEW | 全局、数据库、表 | 允许查看已有视图的视图定义 |
数据权限 | PROCESS | 全局 | 允许查看正在运行的线程 |
结构权限 | CREATE | 全局、数据库、表 | 允许创建数据库和表 |
结构权限 | DROP | 全局、数据库、表 | 允许删除数据库、表和视图 |
结构权限 | CREATE ROUTINE | 全局、数据库 | 允许创建存储过程 |
结构权限 | CREATE TABLESPACE | 全局 | 允许创建、修改或删除表空间和日志组件 |
结构权限 | CREATE TEMPORARY TABLES | 全局、数据库 | 允许创建临时表 |
结构权限 | CREATE VIEW | 全局、数据库、表 | 允许创建和修改视图 |
结构权限 | ALTER | 全局、数据库、表 | 允许修改数据表 |
结构权限 | ALTER ROUTINE | 全局、数据库、存储过程 | 允许修改或删除存储过程 |
结构权限 | INDEX | 全局、数据库、表 | 允许创建和删除索引 |
结构权限 | TRIGGER | 全局、数据库、表 | 允许触发器的所有操作 |
结构权限 | REFERENCES | 全局、数据库、表、列 | 允许创建外键 |
管理权限 | SUPER | 全局 | 允许使用其他管理操作,如CHANGE MASTER TO等 |
管理权限 | CREATE USER | 全局 | CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES |
管理权限 | GRANT OPTION | 全局 | 允许授予或删除用户权限 |
管理权限 | RELOAD | 全局 | FLUSH操作 |
管理权限 | PROXY | 与被代理的用户权限相同 | |
管理权限 | REPLICATION CLIENT | 全局 | 允许用户访问主服务器或从服务器 |
管理权限 | REPLICATION SLAVE | 全局 | 允许复制从服务器读取主服务器二进制日志事件 |
管理权限 | SHUTDOWN | 全局 | 允许使用mysqladmin shutdown |
管理权限 | LOCK TABLES | 全局、数据库 | 允许使用LOCK TABLES锁定拥有SELECT权限的数据库 |
权限级别指权限可以被应用在哪些数据库内容中。
例如,SELECT权限级别是指SELECT权限可以被授予到全局(任意数据库下的任意内容)、数据库(指定数据库下的任意内容)、表(指定数据库下的指定数据库表)、列(指定数据库下的指定数据表中的指定字段)。
授予权限
基本语法:
GRANT 权限名称[(字段列表)][, 权限名称[(字段列表)] ... ] ON 权限级别TO 'username'@'hostname' [, 'username'@'hostname' ... ] [WITH with_option]
- 权限名称:上表中的权限名称
- 字段列表:表示权限设置到哪些字段上。同时给多个字段设置同一个权限时,多个字段名之间使用逗号分隔。如果不指定字段,则设置的权限作用于整个表。
- 权限级别:上表中的权限级别,可以使用下面四种写法
- *.*:表示全局级别的权限,即授予的权限适用于所有数据库和数据库表。
- *:如果当前未选择数据库,表示全局级别的权限;如果当前选择了数据库,则为当前选择的数据库授予权限。
- 数据库名.*:表示数据库级别的权限,即授予的权限适用于指定数据库中的所有表。
- 数据库名.表:表示表级别的权限。如果不指定将授予权限的字段,则授予的权限适用于指定数据库的指定表中的所有列。
- TO子句用于指定一个或多个用户。
- with_option的取值有5个:GRANT OPTION、MAX_QUERIES_PER_HOUR count、MAX_UPDATES_PER_HOUR count、MAX_CONNECTIONS_PER_HOUR count、MAX_USER_CONNECTIONS。
查看权限
tables_priv保存表级别的权限信息,columns_priv保存列级别的权限信息,管理员可以直接查询表看到用户的权限信息。也可以使用SHOW GRANTS
语句查看用户权限。基本语法:
SHOW GRANTS FOR 'username'@'hostname';
撤销权限
为保证数据库的安全,对于用户一些不必要的权限应该及时撤销。MySQL提供了REVOKE语句用于撤销用户的权限,其基本语法:
REVOKE 权限名称[(字段列表)] [, 权限名称[(字段列表)] ...] ON 权限级别FROM 'username'@'hostname' [, 'username'@'hostname' ... ]
当撤销的权限比较多时,这种方式就比较烦琐。MySQL还提供了一次性撤销所有权限的功能,基本语法:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'username'@'hostname' [, 'username'@'hostname' ... ]
要使用REVOKE语句,必须拥有MySQL数据库的全局CREATE USER权限或UPDATE权限。
USAGE权限只能用于登录MySQL数据库,不能执行其他任何的操作;该权限不能被撤销。
权限生效机制
在MySQL中可以通过两种方式完成授权和撤销权限,但它们的生效机制却不一样。
- 通过GRANT、REVOKE语句对用户进行授权、撤销的操作,权限的修改会立即生效。
- 通过DML语句(insert、update和delete)直接修改权限系统表来完成授权和撤销,需要手动执行
flush privileges
语句让MySQL重装装载权限系统表或重启MySQL数据库后,修改才会生效。
当MySQL生效新的权限信息时,对客户端会有以下影响: - 全局性的权限更改和新密码的设置会在下一次客户端连接时生效。
- 数据库级别的权限更改会在下一次使用
USE database_name
语句时生效。 - 对象级别的权限更改(如表和列),会在客户端下一次请求该对象时生效。
访问控制的实现
MySQL访问控制实际上由两个功能模块共同完成:用户管理模块、访问控制模块。
用户管理模块主要是验证用户的合法性,验证用户是否能够访问MySQL数据库;而访问控制模块则需要根据权限系统表中存储的权限信息来决定用户的权限。