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引 ...
随机推荐
- jQuery慢慢啃筛选(四)
1.eq(index|-index) 获取第N个元素 其中负数:一个整数,指示元素的位置,从集合中的最后一个元素开始倒数.(1算起) $("p").eq(1)//获取匹配的第二个元 ...
- java数据类型学习
java数据类型基本分为两类: 一类为基本数据类型: 数值类型: 整数类型:byte.short.int.long 浮点类型:float.double 字符类型:char 布尔类型:boolean 一 ...
- 你知道HTML标签设计的本意吗? 把HTML标签用到该用的地方去
"DIV+CSS"这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是DIV+CSS文件的组合.这样做,对于视觉上并没有什么影响, ...
- Git配置安装使用教程操作github上传克隆数据
Git是何方神圣? Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容 ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
- bzoj2096: [Poi2010]Pilots
Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是 ...
- OSSchedLock()函数透析
uC/OS-II的OSSchedLock()和OSSchedUnlock()函数允许应用程序锁定当前任务不被其它任务抢占. 使用时应当注意的是:当你调用了OSSchedLock()之后,而在调用OSS ...
- AMD:浏览器中的模块规范
前面提到,为实现与Node.js相同方式的模块写法,大牛们做了很多努力. 但浏览器环境不同于服务器端,它的模块有一个HTTP请求过程(而Node.js的模块文件就在本地),这个请求过程多数使用scri ...
- Javascript Framework Scenario
Mobile----- zepto, jQuery Scroll------ iscrollhttp://cubiq.org/iscroll-4 jo.js widget----- jquery pl ...
- 自制SCVMM 模板成功
其实,如果通过SCVMM 的PS命令来创建虚拟机的话,模板的意义也不是特别大. 其它的PROFILE和硬件配置都会被替换掉的. ~~~~~~~~~~~~~~~ Windows模版 一. 准备OS的VH ...