欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-14 16:04:15
一.概述 接着上篇的权限介绍,当用户进行连接的时候,权限表的存取过程有以下两个阶段: (1) 先从user表中的host,user, authentication_string 这3个字段中判断连接的ip,用户名,密码是否存在于表中,如果存在,则通过身份验证。 (2) 通过验证后,则按照以下权限表的 ......

一.概述

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

  (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'

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

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

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

select * from  mysql.`db`

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

    下面演示第二阶段:将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'

    mysql 开发进阶篇系列 52 权限与安全(系统四个权限表的粒度控制关系)
    通过上面的演示,知道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`

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

 

  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`;

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

select * from mysql.`columns_priv`

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

   

 总结:通过上面的例子可以看出, 当用户通过权限认证,进行权限分配时,将按照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。