一.概述

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

  (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. vue 导航守卫,验证是否登录

    路由跳转前,可以用导航守卫判断是否登录,如果登录了就正常跳转,没有登录就把路由指向登录页面. router.beforeEach((to, from, next) => { const next ...

  2. cerr与cout区别

    语言:C++ 一.简介 平常常会用的主要有三个:cout.cerr.clog,首先简单介绍下三者. 这三者在C++中都是标准IO库中提供的输出工具(至于有关的重载问题在此不讨论): cout:写到标准 ...

  3. JS-MD5加密

    首先,下载MD5文件压缩包 点击下载MD5压缩包 然后,在需要加密的页面引用MD5脚本文件 <script src="js/md5.js" type="text/j ...

  4. JS格式化日期时间的方法

    //格式化时间的方法 function format(fmt, date) { var o = { "M+": date.getMonth() + 1, //月份 "d+ ...

  5. FileReader实现图片预览,并上传(js代码)

    var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i; //控制格式 var iMaxFilesi ...

  6. UNIX笔记 第二天

    一.进程的退出: exit(3) _exit(2) atexit(3)  onexit(3) 二.进程资源的回收:wait(2) waitpid(2) 三.加载新的可执行程序: exec函数族 exe ...

  7. 【慕课网实战】三、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    前置要求: 1)Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+ 2)export MAVEN_OPTS=&qu ...

  8. react整理一二(初入React世界)

    react重要思想:组件化(按钮组件.对话框组件.日期组件等等).JSX语法 react把代码和正式渲染目标隔离开来,除了可以在浏览器渲染到DOM来开发网页,还能用于开发原生移动运用 1.专注视图层: ...

  9. 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法

    不知道你有没有遇到过这样的问题,网站访客多起来后,心里很是高兴,加上了Nginx反向代理,出问题了 原来是这么写的: Request.Url.ToString() 输出是这样的: http://www ...

  10. 面试官问我,使用Dubbo有没有遇到一些坑?我笑了。

    前言 17年的时候,因为一时冲动没把持住(当然最近也有粉丝叫我再冲动一把再更新一波),结合面试题写了一个系列的Dubbo源码解析.目前公众号大部分粉丝都是之前的粉丝,这里不过多介绍. 根据我的面试经验 ...