mysql笔记:14. 权限管理


在实际生产中,为了保证数据的安全,数据库管理人员需要为不同的操作人员分配不同的权限,限制登录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数据库;而访问控制模块则需要根据权限系统表中存储的权限信息来决定用户的权限。

访问控制模块
用户管理模块
逐个验证权限系统表
客户端请求执行SQL语句
SQL语句执行成功
匹配成功
SQL语句被拒绝
匹配失败
验证请求连接
客户端请求连接
权限系统表mysql.user
客户端连接被拒绝
验证失败
验证通过
  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值