演示一个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,如需转载请自行联系原作者


相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
2月前
|
测试技术 开发者
守护代码质量的利器:揭秘Vaadin单元测试的奥秘,助你打造无懈可击的Web应用
【8月更文挑战第31天】在软件开发中,单元测试是确保代码质量和稳定性的重要手段。对于使用Vaadin框架开发的Web应用,有效的单元测试尤为关键。Vaadin提供了完善的工具链支持,并鼓励测试驱动开发(TDD)。本文详细介绍了如何为Vaadin应用编写单元测试,并通过具体示例展示了测试环境搭建、依赖配置以及对简单`UserForm`组件的测试方法。通过JUnit和Mockito,我们验证了表单字段的变化及有效性,确保组件按预期工作,从而提升应用的整体健壮性和可靠性。这不仅有助于发现潜在问题,还能简化未来的维护工作。
33 0
|
2月前
|
安全 API 数据库
深入剖析Entity Framework Core中的查询过滤器:实现细粒度数据访问控制的全方位指南与实战代码示例
【8月更文挑战第31天】本文通过实例详细介绍了如何在Entity Framework Core中使用查询过滤器实现细粒度的数据访问控制。从创建基于EF Core的项目、配置数据库上下文到定义领域模型,逐步展示了查询过滤器的应用方法。通过具体代码示例,说明了如何设置全局过滤规则及在不同场景下关闭过滤器,以执行特定查询。此外,还探讨了如何结合用户身份验证和授权,实现基于角色的数据访问控制,确保数据安全性。通过这些步骤,帮助开发者构建高效且安全的数据库访问层。
27 0
|
3月前
|
安全 Java 数据库
在Java中实现高并发的数据访问控制
在Java中实现高并发的数据访问控制
|
10月前
|
分布式计算 DataWorks MaxCompute
在DataWorks中进行数据访问控制权限申请
在DataWorks中进行数据访问控制权限申请
128 1
ly~
|
2天前
|
消息中间件 搜索推荐 大数据
一般情况下在 RocketMQ 中添加 access key 的步骤: 一、确定配置文件位置 RocketMQ 的配置文件通常位于安装目录下的 conf 文件夹中。你需要找到 broker.conf 或相关的配置文件。 二、编辑配置文件 打开配置文件,查找与 ACL(访问控制列表)相关的配置部分。 在配置文件中添加以下内容:
大数据广泛应用于商业、金融、医疗和政府等多个领域。在商业上,它支持精准营销、客户细分及流失预测,并优化供应链管理;金融领域则利用大数据进行风险评估、市场预测及欺诈检测;医疗行业通过大数据预测疾病、提供个性化治疗;政府运用大数据进行城市规划和公共安全管理;工业领域则借助大数据进行设备维护、故障预测及质量控制。
ly~
7 2
|
2月前
|
安全 Linux 数据库
|
5月前
|
安全 网络安全 数据安全/隐私保护
【专栏】IT 知识百科:访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限
【4月更文挑战第28天】访问控制列表(ACL)是网络安全的关键机制,用于定义和管理网络资源的访问权限。ACL工作原理包括定义规则、匹配规则和执行操作。标准ACL基于源IP过滤,扩展ACL则提供更多筛选条件。时间及用户基础的ACL提供更细化的控制。优点在于增强安全性和精细管理,但管理复杂性和性能影响也是挑战。未来,ACL将趋向智能化和自动化,与更多安全技术结合,以提升网络安全。**
331 0
|
2月前
|
网络安全 数据安全/隐私保护 网络架构
|
2月前
|
安全 网络安全 数据安全/隐私保护
|
4月前
|
网络协议 安全 数据安全/隐私保护
交换机访问控制列表(ACL)详解
交换机访问控制列表(ACL)详解
286 0