一步一脚印

总结日常点滴积累——ZengHao's Blog

MySQL权限系统详解
一、基本介绍
MySQL 的权限系统主要存储在几个被称为 grant tables 的系统表中,即:mysql.User,mysql.db,mysql.Host,mysql.table_priv 和 mysql.column_priv。
由于权限信息数据量比较小,而且访问又非常频繁,所以 Mysql 在启 动的时候,就会将所有的权限信息都 Load 到内存中保存在几个特定的结构中。所以才有我 们每次手工修改了权限相关的表之后,都需要执行“FLUSH PRIVILEGES ” 命令重新加载 MySQL 的权限信息。
如果我们通过 GRANT , REVOKE 或者 DROP USER 命令来修改相关权限,则 不需要手工执行 FLUSH PRIVILEGES 命令,因为通过 GRANT,REVOKE 或者 DROP USER 命令所 做的权限修改在修改系统表的同时也会更新内存结构中的权限信息。

二、权限级别
MySQL 中的权限分为五个级别
  1. Global Level
Global Level 的权限控制又称为全局权限控制,所有权限信息都保存在 mysql.user 表 中,如果一个权限是以 Global Level 来授予的,则会覆盖其他所有级别的相同权 限设置,Global Level 主要有如下这些权限 (以下为5.0.3以上版本拥有权限),授权主要使用*.*命令,如: GRANT SELECT,UPDATE,DELETE,INSERT ON *.*  TO 'test'@'localhost';

权限

权限级别

权限说明

CREATE

数据库、表或索引

创建数据库、表或索引权限

DROP

数据库或表

删除数据库或表权限

GRANT OPTION

数据库、表或保存的程序

赋予权限选项

REFERENCES

数据库或表

 

ALTER

更改表,比如添加字段、索引等

DELETE

删除数据权限

INDEX

索引权限

INSERT

插入权限

SELECT

查询权限

UPDATE

更新权限

CREATE VIEW

视图

创建视图权限

SHOW VIEW

视图

查看视图权限

ALTER ROUTINE

存储过程

更改存储过程权限

CREATE ROUTINE

存储过程

创建存储过程权限

EXECUTE

存储过程

执行存储过程权限

FILE

服务器主机上的文件访问

文件访问权限

CREATE TEMPORARY TABLES

服务器管理

创建临时表权限

LOCK TABLES

服务器管理

锁表权限

CREATE USER

服务器管理

创建用户权限

PROCESS

服务器管理

查看进程权限

RELOAD

 

 

服务器管理

执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限

REPLICATION CLIENT

服务器管理

复制权限

REPLICATION SLAVE

服务器管理

复制权限

SHOW DATABASES

服务器管理

查看数据库权限

SHUTDOWN

服务器管理

关闭数据库权限

SUPER

服务器管理


执行kill线程权限
  1. Database Level
其作用域 即为所指定整个数据库中的所有对象,与 Global Level 的权限相比,Database Level 主要 少了以下几个权限: CREATE USER , FILE , PROCESS , RELOAD , REPLICATION CLIENT , REPLICATION ,SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和 USAGE 这几个权限。授权方式有两种:
    1.  在执行 GRANT 命令的时候,使用database.*命令,如 GRANT ALTER ON test.* TO 'test'@'localhost';
    2. 先通过 USE 命令选定需要授权的数据库,然后通过“* ” 来限定作用域,这样授权的 作用域实际上就是当前选定的整个数据库。如:USE test;,命令行出现:“Database changed”后,再执行GRANT DROP ON * TO 'test'@'localhost';
    3. 在授予权限的时候,如果有相同的权限需要授予多个用户,我们也可以在授权语句中一 次写上多个用户信息,通过逗号(,)分隔开就可以了,如:grant create on perf.* to  'abc'@'localhost','test'@'localhost';
  1. Table Level
Table Level 的权限由于其作用域仅限于某个特定的表,所以权限种类也比较少,仅有 ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT UPDATE 这八种权限。
作用范围是授权语句中所指定数据库的指定表。如可以通过如下语 句给 test 数据库的 t1 表授权:GRANT INDEX ON test.t1 TO  'test'@'localhost ';
  1. Column Level
作用范围仅仅是某个表的指定的某个(或某些)列,针对 Column Level 级别的 权限仅有INSERT , SELECT和UPDATE 这三种。 Column Level的权限授权语句语法基本和Table Level 差不多,只是需要在权限名称后面将需要授权的列名列表通过括号括起来,如:GRANT SELECT(id,value) ON test.t2 TO  'test'@'localhost';
  1. Routine Level
Routine Level 的权限主要只有 EXECUTE 和 ALTER ROUTINE 两种,主要针对的对象是 procedure 和 function 这两种对象,在授予 Routine Level 权限的时候,需要指定数据库 和相关对象,如:GRANT EXECUTE ON test.p1 to  'test'@'localhost';

除了上面几类权限之外,还有一个非常特殊的权限 GRANT,拥有 GRANT 权限的用户可以 将自身所拥有的任何权限全部授予其他任何用户,所以 GRANT 权限是一个非常特殊也非常重 要的权限。 GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行 GRANT 授权语句的时候在最后添加 WITH GRANT OPTION 子句达到授予 GRANT 权限的目的
此外,我们还可以通过 GRANT ALL 语句授予某个 Level 的所有可用权限给某个用户:grant all on test.t5 to 'abc'

三、 MySQL访问控制原理
MySQL 访问控制实际上由用户管理模块、访问控制模块两个功能模块共同组成,如下是两个模块的组合示意图:

下面来详细描述两个模块:
  1. 用户管理模块:控制哪些来访者合法,主要通过mysql.user表控制,里面主要包括host,user,password以及各种具备的权限,如下是mysql.user一行记录所具有的属性示意:

  1. 访问控制模块:负责监控来访者每一个动作的访问控制模块,当 MySQL 接收到客户 端的请求之后,访问控制模块需要校验该用户是否满足提交的请求所需要的权限,验证所有所需权限的时候,MySQL 首先会查找存储在内存结构中的权限数据,首先查 找 Global Level 权限,如果所需权限在 Global Level 都有定义(GRANT 或者 REVOKE ), 则完成权限校验(通过或者拒绝),如果没有找到所有权限的定义,会继续往更小范围的权限定义域查找 ,进行 Global Level 未定义的所需权限的校验。,假如我们发出如下请求:SELECT id,name FROM test.t4 where status = 'deleted';,下面是权限控制的相关流程图:


阅读更多
版权声明:转载请注明本文源地址 https://blog.csdn.net/qwe6112071/article/details/68952220
文章标签: mysql 权限管理
个人分类: 数据库
所属专栏: MySQL入门详解
想对作者说点什么? 我来说一句

权限系统

权限系统

学院

2017年04月08日 20:01

权限系统概要-权限系统概要

2009年12月18日 15KB 下载

MySQL外键详解

2011年10月21日 32KB 下载

MySql外键设置详解

2011年06月03日 28KB 下载

没有更多推荐了,返回首页

不良信息举报

MySQL权限系统详解

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭