mysql 开发进阶篇系列 52 权限与安全(系统四个权限表的粒度控制关系)
一.概述
接着上篇的权限介绍,当用户进行连接的时候,权限表的存取过程有以下两个阶段:
(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 权限与安全(系统四个权限表的粒度控制关系)的更多相关文章
- mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
一. 安装说明 安装XtraBackup 2.4 版本有三种方式: (1) 存储库安装Percona XtraBackup(推荐) (2 )下载的rpm或apt包安装Percona XtraBacku ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)
1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
- mysql 开发进阶篇系列 54 权限与安全(账号管理的各种权限操作 下)
1. 查看权限 -- 如果host值不是%, 就要加上host值,下面查看bkpuser用户权限(6个权限, 限本地连接) SHOW GRANTS FOR bkpuser@localhost; -- ...
- mysql 开发进阶篇系列 51 权限与安全(权限表user,db详细介绍 )
一.概述 mysql 的权限系统主要用来对连接到数据库的用户进行权限验证,以此来判断此用户是否属于合法用户,以及合法用户给予的相应数据库权限.下面将介绍权限系统的工作原理,以及将要熟练掌握账号的管理和 ...
随机推荐
- Beta冲刺吐槽&&获小黄衫心得
引 个人感觉本次Beta冲刺最大的槽点还是--反向延长 "冲刺周期" 做的不一样很容易,做的更好才是非常困难的 遗留的问题 经历了Alpha冲刺,组内大多数同学也大都对实践感到些许 ...
- 构建器Constructor的返回值/构建器
构建器Constructor的返回值? 为什么会有这个问题? 在<Thinking in Java>中文Quanke翻译版本第四章初始化和清除,原书第五章Initialization&am ...
- 每日一练ACM 2019.0416
2019.04.16 Problem Description Your task is to Calculate the sum of some integers. Input Input ...
- http post 请求详解
一步一步了解http post 请求 (大白话版). 1.创建一 个 CloseableHttpClient 对象 CloseableHttpClient client = HttpClients. ...
- Linux---基础指令(一)
https://www.linuxprobe.com/chapter-02.html (Linux就要这么学) 一.执行查看帮助命令 date:date命令用于显示及设置系统的时间或日期,格式为“d ...
- (23)The surprising connection between brain injuries and crime
https://www.ted.com/talks/kim_gorgens_the_surprising_connection_between_brain_injuries_and_crime/tra ...
- function()
avaScript中的function可以有以下两种用法:一是做“普通逻辑代码容器”,也就是我们通常意义上的函数.方法,和我们C/C++里的函数没什么大分别,只是写法稍有不同.用法更加灵活:二是做对象 ...
- 学习Python第七天
进制拾遗: 二进制:01 八进制:01234567 十进制:0123456789 十六进制:0123456789ABCDEF 十进制转换八,十六进制语法 oct()八进制 关于8进制是逢8进一位的,我 ...
- div+css+position实现简单的纵向导航栏
完成效果: 这应该是很简单的纵向导航栏了. OK,进入正题 首先,我们看上面的效果图可以分析得出,要实现这个效果需要用到的技术点 1.hover 2.position 3.布局 我认为在这个效果的实现 ...
- Java基础巩固——排序
快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对两部分继续进行排序,直到整个序列有序. 实例: 1.一趟排序的过程: 2.排序的全 ...