当前位置: 移动技术网 > IT编程>数据库>Mysql > mysql 开发进阶篇系列 52 权限与安全(系统四个权限表的粒度控制关系)

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

2018年10月19日  | 移动技术网IT编程  | 我要评论

一.概述

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

  (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 '123456';
-- 赋予所有数据库上的所有表的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。

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网