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 的权限系统主要用来对连接到数据库的用户进行权限验证,以此来判断此用户是否属于合法用户,以及合法用户给予的相应数据库权限.下面将介绍权限系统的工作原理,以及将要熟练掌握账号的管理和 ...
随机推荐
- SHELL脚本学习-练习写一个脚本3
#通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...
- ActivityThread 源码分析
ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...
- [Bat]UNC路径不支持的2种解决方法
UNC(Universal Naming Convention),\\servername\sharename,其中servername是服务器名.sharename是共享资源的名称 1.使用push ...
- SAS 创建新变量
SAS 创建新变量 在对SAS数据集进行处理时,经常需要根据原有变量或变量值生成新变量.根据要实现功能的不同,SAS提供了多种方法,例如通过数据集选项RENAME=(RENAME语句).赋值语句.求 ...
- sjms-1 面向对象
面向对象设计 先设计架构,然后去完成相应模块和类 设计模式:对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案.每一个设计模式系统地命名.解释和评价了面向对象系统中一个重要的和重复出现的设计 ...
- redis_字典_哈希hash
字典.哈希表基本数据结构 redis字典使用哈希表作为底层实现,基本结构就是数组+散列 typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈 ...
- ADO.NET MSSSQLServer 操作简要总结
1).数据库操作首先应该是链接,链接的方式有多种,不论怎样实现最终都是把链接字符串赋值给实现了 继承自DbConnection 类的SqlConnection类实例的ConnectionString属 ...
- fiddler中断request,修改参数问题
fiddler正在学习阶段,遇到了一个问题,就是bpu url后,不会修改参数,今天实验了几次,总算成功了 下面写一下步骤: 1.先打开fiddler 2.打开网站,如百度,在文本框输入1,记住!不要 ...
- app -webkit-box-orient: vertical 打包后不显示
先说明问题是什么: -webkit-box-orient: vertical 这个属性在本地运行调试是存在的,但是打包后这个属性消失了: 解决办法: 1.将-webkit-box-orient: ve ...
- Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表
Python核心团队计划在2020年停止支持Python 2.NumPy项目自2010年以来一直支持Python 2和Python 3,并且发现支持Python 2对我们有限的资源增加了负担:因此,我 ...