DBMS_RLS包实现数据库表中的行级安全控制
DBMS_RLS 实现一个数据库表为行级安全控制,该套餐包括细粒度的访问控制管理界面,此接口是用来实现VPD(Virtual Private Database),虚拟专用数据库。DBMS_RLS仅仅能在ORACLE的企业版(Enterpris Edition Only)本才干够用。oracle ebs 的权限是用这个来管理的。
在数据库的数据安全訪问的解决上,有非常多的方法来解决权限的问题。有的是通过功能模块来控制訪问权限的,有的是用建立视图的方法控制,比如查询语句中加where语句来控制。可是用view的方法时,当表结构或者权限变更的时候就非常不easy操作,编码工作量大、系统适应用户管理体系的弹性空间较小,一旦权限逻辑发生变动,就可能须要改动权限体系,导致全部的View都必须改动;用where语句能够解决这个问题可是安全性不好,仅仅能在应用程序级别才干控制。绕开应用程序就无法控制。
Oracle VPD 技术在数据库级别的安全控制有效的攻克了数据訪问操作的权限问题,能够对数据库对象进行訪问控制,能够灵活的隔离数据,oracle已经实现了VPD,能够直接使用。比在应用层权限控制实现起来较方便,权限维护也比easy。
VPD訪问控制原理也是使用where语句来控制,仅仅是这个where语句是数据库在操作数据时自己主动拼接,不是在应用层拼接,并且由事先定义的策略来决定是否拼接条件语句。
以下我来用DBMS_RLS的包来实现例如以下条件的訪问控制功能:
有例如以下4个用户AM145,AM147,AM148,AM149
1,仅仅能查询OE.CUSTS表,
2,其过滤条件是OE.CUSTS.account_mgr_id=substr(user,3,3)
第一步:创建用户及訪问授权
$>sqlplus / as sysdba
create user AM145 identified by AM145;
grant create session to AM145;
grant select on oe.custs to AM145;
create user AM147 identified by AM147;
grant create session to AM147;
grant select on oe.custs to AM147;
create user AM148 identified by AM148;
grant create session to AM148;
grant select on oe.custs to AM148;
create user AM149 identified by AM149;
grant create session to AM149;
grant select on oe.custs to AM149;
第二步:创建function获得where 过滤条件的predicate.函数返回拼接在DML语句的where条件之后的语句,可是where语句并非运行DML时可见的,系统根绝策略自己主动加入的,条件来自策略函数的返回值。
vi fun1.sql
create or replace FUNCTION oe.policy_function (object_schema IN VARCHAR2, object_name VARCHAR2)
RETURN VARCHAR2 IS
ls_return varchar2(100);
ls_username varchar2(100);
begin
ls_username := user;
if ls_username like 'AM%' then
ls_return := 'oe.custs.account_mgr_id=substr('||''''||ls_username||''''||',3,3)';
end if;
return ls_return;
end;
/
SQL> @fun1.sql
Function created.
第三步:加入策略
vi myPolicy1.sql
BEGIN
dbms_rls.add_policy(object_schema => 'oe',
object_name => 'custs',
policy_name => 'my_policy1',
function_schema =>'oe',
policy_function => 'policy_function',
statement_types =>'select',
enable=>true);
END;
/
SQL> @myPolicy1.sql
PL/SQL procedure successfully completed.
第四步:验证是否成功
SQL> select account_mgr_id,count(*) from oe.custs group by account_mgr_id;
ACCOUNT_MGR_ID COUNT(*)
-------------- ----------
147 76
149 74
148 58
145 111
SQL> conn AM145/AM145
Connected.
SQL> select count(*) from oe.custs;
COUNT(*)
----------
111
SQL> conn AM147/AM147
Connected.
SQL> select count(*) from oe.custs;
COUNT(*)
----------
76
SQL> conn AM148/AM148
Connected.
SQL> select count(*) from oe.custs;
COUNT(*)
----------
58
SQL> conn AM149/AM149
Connected.
SQL> select count(*) from oe.custs;
COUNT(*)
----------
74
从上面能够看出,对用户AM145,AM147,AM148,AM149的訪问控制成功。
Note:删除策略:
SQL> CONN / AS SYSDBA
Connected.
SQL> exec DBMS_RLS.DROP_POLICY('oe', 'CUSTS', 'my_policy1');
PL/SQL procedure successfully completed.
SQL> conn AM145/AM145
Connected.
SQL> select count(*) from oe.custs;
COUNT(*)
----------
319
删除策略后用户AM145,AM147,AM148,AM149是能够看OE表的全部的行数据的。
版权声明:本文博主原创文章,博客,未经同意不得转载。
DBMS_RLS包实现数据库表中的行级安全控制的更多相关文章
- Django学习路5_更新和删除数据库表中元素
查找所有的元素 Student.objects.all() 查找单个元素 Student.objects.get(主键=值) 主键 pk = xxx 更新数据库数据后进行保存 stu.save() 删 ...
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的
我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- [SAP ABAP开发技术总结]将文件存储到数据库表中,并可发送邮件
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 针对Oracle数据库表中的数据的常见操作
1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名 for update; 例:sele ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
随机推荐
- 自定义复选框 checkbox 样式
默认的复选框样式一般在项目中都很少用 ,看起来也丑丑的.这里提供一个优化样式后的复选框.原理就是隐藏掉默认样式,在用设计好的样式替代 html结构 <div> <input type ...
- ecshop 商店设置,新增或者修改字段
当想要新增选项到ecshop的商店设置时, 第一步:在ecs_shop_config这个表增加一条设置项记录 parent_id.code.type.value type 会有 group text ...
- TortoiseSVN显示图标不正常
Windows Explorer Shell支持的Overlay Icon最多15个,除去系统使用,只有11个.如果其他程序占用了,那么乌龟SVN就无法显示了.注册表定位到:HKEY_LOCAL_MA ...
- 单个ViewController支持横屏,其他全竖屏方法-b
如果项目中用了navigationViewController, 那么就应该新建一个uinavigationViewController的子类,然后在这个类里面写上下面的代码,在使用的时候就用自定义的 ...
- CSS 的 border 样式
制作过网页的人都有为画线而烦恼的经历,先来认识一下“Border”(画边框),它是CSS的一个属性,用它可以给能确定范围的HTML标记(如TD.DIV等等)画边框,它可以定义边框线的类型.宽度和颜色, ...
- test知识
内部测试SIT ——system integration testcase 用户测试UAT——user acceptance test SIT是集成测试UAT是验收测试从时间上看,UAT要在SIT后面 ...
- JS获取select选中的值
var oSel=oFl.getElementsByTagName('select')[0]; oSel.onchange=function(){ var indexselect=oSel.selec ...
- 应用SVN(CentOS中搭建SVN服务器)
简单介绍如何在虚拟机 CentOS 中,搭建 SVN 服务器. 软件版本信息 Vmware 10.0.0 build-1295980 CentOS 7.0-1406-x64 Java 1.7.0_67 ...
- JavaScript Book Plan
1. HTML5 2. Library & Framwork About Performance Tool and Process https://developers.google.com/ ...
- Flux工作流
Flux工作流 模型层(M)和控制层(C) Flux 只是这个模式的一个例子. 很多代码和一堆重复的模板 在其他JavaScript环境中实现重用. 强大又容易配置的模块化打包工具Webpack来简化 ...