• Mysql中视图的安全验证方式


    DEFINER:指定视图的创建者(或者说属主,虽然MySQL中的对象其实不注重属主,这点与ORACLE数据库极为不同),默认当然就是执行CREATE VIEW语句的CURRENT_USER,但是创建时也可以指定不同的用户做为创建者(或者叫视图所有人);
    SQL SECURITY:视图查询数据时的安全验证方式,有两处选项:
    DEFINER:这个不是指创建者了,而是说在创建视图时验证是否有权限访问视图所引用的数据;
    INVOKER:指查询视图时,验证查询的用户是否拥有权限访问视图及视图所引用的对象;
    首先创建两个视图:

    mysql> create sql security definer view j1_v_d as select * from jssdb.j1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> create sql security invoker view j1_v_i as select * from jssdb.j1;
    Query OK, 0 rows affected (0.00 sec)

    然后我们新建一个用户tmpdb,仅授予增删改查tmpdb库的权限(并没有操作jssdb.j1的权限):

    mysql> grant select,insert,update,delete on tmpdb.* to tmpdb identified by "tmpdb";
    Query OK, 0 rows affected (0.00 sec)

    然后,使用新创建的用户登录执行操作:

    [root@test ~]# mysql -utmpdb -p'tmpdb' -h 192.168.11.212 -P 3306 -D tmpdb
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 10425056
    Server version: 5.0.56-log Source distribution
    Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
    mysql> show databases;
    +--------------------+
    
    | Database           |
    
    +--------------------+
    
    | information_schema | 
    
    | test               | 
    
    | tmpdb              | 
    
    +--------------------+
    
    3 rows in set (0.00 sec)
    
    mysql> show tables;
    
    +-----------------+
    
    | Tables_in_tmpdb |
    
    +-----------------+
    
    | j1_v_d          | 
    
    | j1_v_i          | 
    
    +-----------------+
    2 rows in set (0.00 sec)

    先来看看操作definer验证方式下的视图:

    mysql> select * from j1_v_d;
    +------+------+
    
    | id   | vl   |
    
    +------+------+
    
    |    1 | a0   | 
    
    |    2 | bb   | 
    
    +------+------+
    2 rows in set (0.00 sec)
    
    mysql> insert into j1_v_d values (3,'cc');
    Query OK, 1 row affected (0.01 sec)

    可以看到,查询和更新都没有问题,接下来再试试invoker权限定义的视图:

    mysql> select * from j1_v_i;
    ERROR 1356 (HY000): View 'tmpdb.j1_v_i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

    查询时就报错了,更新就更不用说了。上面的这种情况,是由于tmpdb用户没有操作jssdb下对象的权限,因此读取j1_v_i对象时就失败了(虽然它有访问j1_v_i对象的权限)。
    这个简单的测试足以表明:
    definer是在定义对象是判断是否有权限,只要创建的用户有权限,那么创建就可以成功,而且所有有权限查询该视图的用户也能够成功执行查询语句 - 不管是否拥有该视图所引用对象的权限;
    invoker是指在查询时验证用户是否有权限执行操作,当然创建时也会判断,如果创建的用户没有视图所引用表对象的访问权限,那创建都会失败。

  • 相关阅读:
    HTML5学习笔记简明版(1):HTML5介绍与语法
    用margin还是用padding(1)——W3School CSS外边距合并
    Minimum Depth of Binary Tree
    118. Pascal's Triangle
    Convert Sorted Array to Binary Search Tree
    112. Path Sum
    Balanced Binary Tree
    centos 7下nginx搭建流媒体服务器【动态添加模块】
    Java内存泄漏
    Quartz的job中注入的services接口为空的解决办法
  • 原文地址:https://www.cnblogs.com/yangyi922/p/3642504.html
Copyright © 2020-2023  润新知