演示一个VPD进行数据访问控制的示例

简介:

更多精彩内容尽在www.leonarding.com


1.什么是VPDVirtual PrivateDatabase 虚拟私有数据库,听起来像是一个独立自主的数据库,其实在逻辑上是独立的,物理上就是一个数据库。原理就是通过指定过滤策略,对用户的SQL添加谓词条件,来达到过滤数据的目的。

2.VPD优点:

精细化访问

对业务透明,不同的客户发出相同SQL语句,查询到的结果集不一样,可以让不同客户只看其相关的数据

对用户透明,用户感知不到

不对数据本身做任何操作,只在SQL层面进行过滤处理

VPD是数据库默认自带的,无需独立安装

3.实验

我们建一张业务表car,有汽车名,汽车数量,汽车价格三个字段,插入9条记录,分成高中低三个档次

LEO1@LEO1>create table car (namevarchar2(20),num number,cost number);

Table created.

LEO1@LEO1>insert into carvalues('toyota',10,30);         高级车

1 row created.

LEO1@LEO1>insert into carvalues('volvo',50,30);

1 row created.

LEO1@LEO1>insert into carvalues('honda',60,30);

1 row created.

LEO1@LEO1>insert into carvalues('biaozhi',70,20);        中级车

1 row created.

LEO1@LEO1>insert into carvalues('xuetielong',80,20);

1 row created.

LEO1@LEO1>insert into car values('polo',90,20);

1 row created.

LEO1@LEO1>insert into carvalues('xiali',20,10);          低级车

1 row created.

LEO1@LEO1>insert into carvalues('jili',30,10);

1 row created.

LEO1@LEO1>insert into carvalues('byd',40,10);

1 row created.

LEO1@LEO1>commit;

Commit complete.

LEO1@LEO1>select * from car;

NAME                        NUM       COST

-------------------- ------------------------------ -------------------- ----------

toyota                       10         30

volvo                        50         30

honda                       60         30

biaozhi                      70         20

xuetielong                   80         20

polo                         90        20

xiali                         20        10

jili                          30        10

byd                         40         10

9 rows selected.

我们的思路:car表上添加过滤策略“filter_name”和“filter_num”,当select语句中有name字段时触发“filter_name”策略,当select语句中有num字段时触发“filter_num”策略,过滤策略由函数“fun_name”和“fun_num”实现。

创建函数“fun_name

LEO1@LEO1>create or replace functionfun_name (fun_scheme varchar2,fun_object  varchar2)

return varchar2 as fun_cost varchar2(20);

begin

fun_cost:='cost=30';

return(fun_cost);

end fun_name;

/

2    3    4   5    6    7  

Function created.

创建函数“fun_num

LEO1@LEO1>create or replace functionfun_num (fun_scheme varchar2,fun_object varchar2)

return varchar2 as fun_cost varchar2(20);

begin

fun_cost:='cost=10';

return(fun_cost);

end fun_num;

/

2    3    4   5    6    7  

Function created.

添加过滤策略“filter_name

LEO1@LEO1>begin

dbms_rls.add_policy(

object_schema => 'leo1',

object_name => 'car',

policy_name => 'filter_name',

policy_function => 'fun_name',

sec_relevant_cols => 'name');

end;

/

2    3    4   5    6    7   8    9  

PL/SQL procedure successfully completed.

添加过滤策略“filter_num

LEO1@LEO1>begin

dbms_rls.add_policy(

object_schema => 'leo1',

object_name => 'car',

policy_name => 'filter_num',

policy_function => 'fun_num',

sec_relevant_cols => 'num');

end;

/

2    3    4   5    6    7   8    9  

PL/SQL procedure successfully completed.

当我们要查询汽车名的时候,会触发filter_name过滤策略,从而调用fun_name函数限制where cost=30的记录显示

LEO1@LEO1>select name,cost from car;

NAME                       COST

-------------------- ----------

toyota                       30

volvo                        30

honda                       30

当我们要查询汽车数量的时候,会触发filter_num过滤策略,从而调用fun_num函数限制where cost=10的记录显示

LEO1@LEO1>select num,cost from car;

      NUM       COST

---------- ----------

       20         10

       30         10

       40         10

当我们不想使用过滤策略的时候,如何删除?

使用drop_policy存储过程来删除,filter_namefilter_num过滤策略

LEO1@LEO1>execute dbms_rls.drop_policy('leo1','car','filter_name');

PL/SQL procedure successfully completed.

LEO1@LEO1>execute dbms_rls.drop_policy('leo1','car','filter_num');

PL/SQL procedure successfully completed.

LEO1@LEO1>select * from car;

NAME                        NUM       COST

-------------------- ---------- ----------

toyota                       10         30

volvo                        50         30

honda                        60         30

biaozhi                      70         20

xuetielong                   80         20

polo                         90         20

xiali                        20         10

jili                         30         10

byd                         40         10

9 rows selected.

利用VPD隐藏敏感列信息

我们设计一个新的“filter_num”策略,只显示cost=10的记录,隐藏num列的汽车数量

LEO1@LEO1>begin

dbms_rls.add_policy(

object_schema => 'leo1',

object_name => 'car',

policy_name => 'filter_num',

policy_function => 'fun_num',

sec_relevant_cols => 'num',

sec_relevant_cols_opt =>dbms_rls.all_rows);      只显示相关的行信息

end;

/

2    3    4   5    6    7   8    9   10  

PL/SQL procedure successfully completed.

LEO1@LEO1>select * from car;

NAME                        NUM       COST

-------------------- ---------- ----------

toyota                                   30

volvo                                    30

honda                                   30

biaozhi                                  20

xuetielong                               20

polo                                    20

xiali                         20        10

jili                          30         10

byd                        40         10

9 rows selected.

小结:VPD是一种行级安全控制,操作简单无需添加任何组件即可实施。


 本文转自 ztfriend 51CTO博客,原文链接:http://blog.51cto.com/leonarding/1223398,如需转载请自行联系原作者


相关文章
|
10月前
|
搜索推荐 安全 数据挖掘
QuickBI行级权限:精细化数据访问控制,轻松实现千人千面
随着企业数据量的快速增长和应用场景的多样化,数据权限管理变得至关重要。QuickBI的行级权限功能通过条件组合授权和用户标签授权两种模式,实现了灵活、精细的数据权限控制。条件组合授权适用于多规则配合场景,如不同部门仅能看到自身产品线数据;用户标签授权则适合大规模个性化权限管理,如按地区限制数据可见性。该功能简化了配置步骤,提高了权限管理效率,确保数据安全合规且有效利用。
560 1
|
测试技术 开发者
守护代码质量的利器:揭秘Vaadin单元测试的奥秘,助你打造无懈可击的Web应用
【8月更文挑战第31天】在软件开发中,单元测试是确保代码质量和稳定性的重要手段。对于使用Vaadin框架开发的Web应用,有效的单元测试尤为关键。Vaadin提供了完善的工具链支持,并鼓励测试驱动开发(TDD)。本文详细介绍了如何为Vaadin应用编写单元测试,并通过具体示例展示了测试环境搭建、依赖配置以及对简单`UserForm`组件的测试方法。通过JUnit和Mockito,我们验证了表单字段的变化及有效性,确保组件按预期工作,从而提升应用的整体健壮性和可靠性。这不仅有助于发现潜在问题,还能简化未来的维护工作。
93 0
|
安全 API 数据库
深入剖析Entity Framework Core中的查询过滤器:实现细粒度数据访问控制的全方位指南与实战代码示例
【8月更文挑战第31天】本文通过实例详细介绍了如何在Entity Framework Core中使用查询过滤器实现细粒度的数据访问控制。从创建基于EF Core的项目、配置数据库上下文到定义领域模型,逐步展示了查询过滤器的应用方法。通过具体代码示例,说明了如何设置全局过滤规则及在不同场景下关闭过滤器,以执行特定查询。此外,还探讨了如何结合用户身份验证和授权,实现基于角色的数据访问控制,确保数据安全性。通过这些步骤,帮助开发者构建高效且安全的数据库访问层。
184 0
|
安全 Java 数据库
在Java中实现高并发的数据访问控制
在Java中实现高并发的数据访问控制
|
分布式计算 DataWorks MaxCompute
在DataWorks中进行数据访问控制权限申请
在DataWorks中进行数据访问控制权限申请
253 1
|
11月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
1532 7
|
11月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
777 4
|
12月前
|
网络协议 网络虚拟化 数据安全/隐私保护
访问控制列表(ACL)配置
访问控制列表(ACL)配置
251 1
访问控制列表(ACL)配置
|
安全 网络安全 数据安全/隐私保护
【专栏】IT 知识百科:访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限
【4月更文挑战第28天】访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限。ACL工作原理包括定义规则、匹配规则和执行操作。标准ACL基于源IP过滤,扩展ACL则提供更多筛选条件。时间及用户基础的ACL提供更细化的控制。优点在于增强安全性和精细管理,但管理复杂性和性能影响也是挑战。未来,ACL将趋向智能化和自动化,与更多安全技术结合,以提升网络安全。**
758 0
|
11月前
|
网络协议 安全 网络性能优化
了解访问控制列表 (ACL):概念、类型与应用
了解访问控制列表 (ACL):概念、类型与应用
936 2