1、什么是VPD?

虚拟专用数据库 (VPD)提供了角色和视图无法提供的行级访问控制。对于互联网访问,虚拟专用数据库可以确保在线银行的客户只能看到他们自己的帐户。Web托管公司可以在同一Oracle 数据库中维护多个公司的数据,但只允许每个公司查看其自身数据。

在企业内部,虚拟数据库可在应用程序部署方面降低拥有成本。可以在数据库服务器一次实现安全性,而不用在访问数据的每个应用程序中分别实现安全性。因为是在数据库中实施安全性,所以不管用户访问数据的方式如何,安全性较以前更高。访问即席查询工具或新报表生成程序的用户不再能绕过安全环节。

2、VPD是如何工作的?

将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数。策略函数返回一个访问条件(WHERE子句),即谓词。应用程序将它附加到用户的 SQL 语句,从而动态修改用户的数据访问权限。

你可以通过编写一个存储过程将 SQL 谓词附加到每个 SQL 语句(用于控制该语句的行级别访问权限)来实施 VPD。如下图,Bob 和 Anna 为两名经理,他们可以查看他们所管理的人员信息,Tim作为普通职员,就只能查看自己的信息。

浅谈基于JDBC实现虚拟专用数据库(VPD)_oracle

使用Oracle VPD实现:

浅谈基于JDBC实现虚拟专用数据库(VPD)_oracle_02

3、实现思路?

实现思路大概如下图

浅谈基于JDBC实现虚拟专用数据库(VPD)_oracle_03


  1.  重写JDBC部分驱动以便后面做手脚

  2. 解析输入SQL,并根据VPD上下文,元数据信息以及VPD规则进行SQL的重新拼装

  3. 针对需要对列权限处理,需要保存必要元数据信息,并且对结果集进行二次处理


参考Oracle Vpd的元数据表设计

浅谈基于JDBC实现虚拟专用数据库(VPD)_oracle_04

实现效果

浅谈基于JDBC实现虚拟专用数据库(VPD)_数据库_05

参考连接:

​http://mohamednabeel.blogspot.com/2014/08/oracle-virtual-private-database-vpd.html​

​https://oracle-base.com/articles/8i/virtual-private-databases​