一.概述

  接着上篇的权限介绍,当用户进行连接的时候,权限表的存取过程有以下两个阶段:

  (1) 先从user表中的host,user, authentication_string 这3个字段中判断连接的ip,用户名,密码是否存在于表中,如果存在,则通过身份验证。

  (2) 通过验证后,则按照以下权限表的顺序得到数据库权限:user->db->table_priv -> columns_priv。

  四个表分别是:user全局权限(第一阶段),db具体数据库权限(第二阶段),table_priv具体表权限(第三阶段),columns_priv表对应的具体列权限(第四阶段)。在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限(这四个表都在mysql系统库中)。

  1.1 第一阶段权限(user权限表)

    下面演示创建一个新用户z1@localhost,并赋予所有数据库上的所有表的select 权限。

-- 创建新用户(创建完成后,此时该新用户没有任何权限,所有权限字段的值都是 N)
CREATE USER 'z1'@'localhost' IDENTIFIED BY '';
-- 赋予所有数据库上的所有表的select 权限(执行grant 后,此时该新用户的Select_priv权限字段的值是 Y,如下图所示)
GRANT SELECT ON *.* TO z1@localhost;
SELECT * FROM  mysql.`user` WHERE `User`='z1' AND `Host`='localhost'

    
  

  1.2 第二阶段权限(db权限表)

    在第一阶段完成后,user表z1@localhost用户的Select_priv字段值是Y,查看db权限表并没有关于z1@localhost用户的信息,在user权限表里,拥有相同权限的用户,是不需要记入db权限表, 这就是全局权限覆盖局部权限, db权限表信息如下图所示:

SELECT * FROM  mysql.`db`

    

    下面演示第二阶段:将z1@localhost用户上的权限改为只针对某一数据库上的所有表的select 权限(这里用test库)。

-- 撤回z1@localhost用户的全局Select_priv权限(此时user权限表的Select_priv权限字段的值是 N)
REVOKE SELECT ON *.* FROM z1@localhost
-- 赋予z1@localhost用户在test数据库的Select_priv权限(此时db权限表的Select_priv权限字段的值是Y,如下图所示)
GRANT SELECT ON test.* TO z1@localhost
SELECT * FROM  mysql.`db` WHERE `User`='z1' AND `Host`='localhost'

    
    通过上面的演示,知道user权限表z1@localhost用户的Select_priv值变成 N , 而db权限表则增加了一条记录。

  

  1.3 第三阶段权限(权限tables_priv表)

-- 撤回z1@localhost用户的局部Select_priv权限 (此时db权限表的Db字段=test的记录信息删除了)
REVOKE SELECT ON test.* FROM z1@localhost
-- 赋予z1@localhost用户在test.testbackup的Select_priv权限(此时tables_priv权限表多了一条信息,如下图所示)
GRANT SELECT ON test.testbackup TO z1@localhost
-- 这里就显示了Host的ip地址,Db哪个数据库,User哪个用户, Table_name哪个表
SELECT * FROM mysql.`tables_priv`

    

  1.4 第四阶段权限(权限columns_priv表)

    最后就是针对表中的列来做权限控制了,还是使用Select_priv权限来演示。

-- 撤回z1@localhost用户test.testbackup表的Select_priv权限 (此时tables_priv权限表的Db字段=test的记录信息删除了)
REVOKE SELECT ON test.testbackup FROM z1@localhost
-- 赋予z1@localhost用户在test.testbackup表(id,name)列的Select_priv权限(此时columns_priv权限表多了二条信息,tables_priv权限表也产生了一条信息,如下所示)
GRANT SELECT(id,`name`) ON test.testbackup TO z1@localhost
SELECT * FROM  mysql.`tables_priv`;

    

SELECT * FROM mysql.`columns_priv`

    

   

 总结:通过上面的例子可以看出, 当用户通过权限认证,进行权限分配时,将按照user->db->table_priv -> columns_priv的顺序进行权限分配,先检查全局权限表user。

      如果user中对应权限为 Y , 则用户将不再检查db,tables_priv,columns_priv。
      如果user中对应权限为 N,  则检查db表此用户对应的具体数据库。

      如果db表中对应权限为 Y, 则不再检查tables_priv,columns_priv。
      如果db表中对应权限为 N, 则检查tables_priv中此数据库对应的具体表。

      如果tables_priv表相应权限为 Y,  则不检查columns_priv中此表对应的具体列。
      如果tables_priv表相应权限为 N, 则检查 columns_priv。

mysql 开发进阶篇系列 52 权限与安全(系统四个权限表的粒度控制关系)的更多相关文章

  1. mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)

    一. 安装说明 安装XtraBackup 2.4 版本有三种方式: (1) 存储库安装Percona XtraBackup(推荐) (2 )下载的rpm或apt包安装Percona XtraBacku ...

  2. mysql 开发进阶篇系列 55 权限与安全(安全事项 )

    一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...

  3. mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)

    一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...

  4. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  5. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)

    一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...

  6. mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

    1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...

  7. mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)

    1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...

  8. mysql 开发进阶篇系列 54 权限与安全(账号管理的各种权限操作 下)

    1. 查看权限 -- 如果host值不是%, 就要加上host值,下面查看bkpuser用户权限(6个权限, 限本地连接) SHOW GRANTS FOR bkpuser@localhost; -- ...

  9. mysql 开发进阶篇系列 51 权限与安全(权限表user,db详细介绍 )

    一.概述 mysql 的权限系统主要用来对连接到数据库的用户进行权限验证,以此来判断此用户是否属于合法用户,以及合法用户给予的相应数据库权限.下面将介绍权限系统的工作原理,以及将要熟练掌握账号的管理和 ...

随机推荐

  1. Springboot+Mybatis+Thymeleaf

    工具Eclipse 2018 Maven 配置 ThymeLeaf 安装:  https://blog.csdn.net/xingqibaing/article/details/82787164 sp ...

  2. 读《赋能》有感zz

    听樊登18年春节后第一本新书<赋能>,学到了几个新的管理词语,深井病.还原论.乌卡时代: 下面谈谈自己的学习收获. 深井病就是随着组织发展的壮大,当然是传统的企业,其部门或个人都会变得越来 ...

  3. Python 知识小tips

    python进制转换函数: 二进制转换成十进制:v = "0b1111011"    # int(v,2) 十进制转换成二进制:v = 18                   # ...

  4. Android手机插上usb能充电但不能识别的一种解决方法

    设备要求 已root的Android手机. 背景 这个方法是意外发现的,最初同事有一台测试机插上usb能充电但不能识别,他让我帮他看看怎么回事,于是我就按照常规套路,开发者模式.usb调试.MTP什么 ...

  5. select、poll、epoll

    1.概念 select.poll.epoll都是事件触发机制,当等待的事件发生就触发进行处理,用于I/O复用 2.简单例子理解 3.select函数 3.1函数详解 int select(int ma ...

  6. fortran常用语句--读写带注释文档、动态数组等语法

    1.判断读取文档有多少行数据(文档最后的空行不计入其中): 首先在变量定义区域下方和执行语句前声明在程序中要被调用的GetFileN函数: external GetFileN 接下来在函数外部后边写上 ...

  7. shell awk处理过滤100万条数据

    背景: 100万条数据.格式如下: ID 地址 1895756546931805 安徽省六安市裕安区固镇镇佛俺村柳树队5758 安徽省蒙城县岳坊镇胡寨村小组小胡寨庄6号 183494167409969 ...

  8. JVM中的堆和栈

    基本概念: 基本数据类型:byte   short   int   long  char  float  double  boolean 引用数据类型:类类型.接口类型和数组 栈内存: 程序在栈内存中 ...

  9. 华为云服务器为Tomcat配置SSL

    近期由于开发小程序需要在云服务器上配置https访问协议,也遇到了一点小问题,把配置过程记录一下:SSL 证书申请下来之后会有 .jks .crt .pfx .pem为后缀的文件(如何申请SSL证书这 ...

  10. Note on Preliminary Introduction to Distributed System

    今天读了几篇分布式相关的内容,记录一下.非经典论文,非系统化阅读,非严谨思考和总结.主要的着眼点在于分布式存储:好处是,跨越单台物理机器的计算和存储能力的限制,防止单点故障(single point ...