mysql rls_DBMS_RLS包实现数据库表行级安全控制

本文介绍了如何使用Oracle的DBMS_RLS包来实现数据库表行级安全控制,该包提供了VPD(Virtual Private Database)功能,允许在企业版Oracle数据库中进行精细的访问控制。通过创建策略函数和添加策略,限制了不同用户对OE.CUSTS表的查询,只允许查看特定条件的数据。示例展示了为四个用户设置访问控制的过程,并验证了策略的效果。
摘要由CSDN通过智能技术生成

DBMS_RLS 是实现数据库表行级别安全控制的,这个包包含精细访问控制管理接口,这个接口是用来实现VPD(Virtual Private Database),虚拟私有数据库。DBMS_RLS只能在ORACLE的企业版(Enterpris Edition Only)本才可以用。oracle ebs 的权限是用这个来管理的。在

DBMS_RLS 是实现数据库表行级别安全控制的,这个包包含精细访问控制管理接口,这个接口是用来实现VPD(Virtual Private Database),虚拟私有数据库。DBMS_RLS只能在ORACLE的企业版(Enterpris Edition Only)本才可以用。oracle ebs 的权限是用这个来管理的。在数据库的数据安全访问的解决上,有很多的方法来解决权限的问题,有的是通过功能模块来控制访问权限的,有的是用建立视图的方法控制,例如查询语句中加where语句来控制。但是用view的方法时,当表结构或者权限变更的时候就很不容易操作,编码工作量大、系统适应用户管理体系的弹性空间较小,一旦权限逻辑发生变动,就可能需要修改权限体系,导致所有的View都必须修改;用where语句可以解决问题但是安全性不好,只能在应用程序级别才能控制,绕开应用程序就无法控制。

Oracle VPD 技术在数据库级别的安全控制有效的解决了数据访问操作的权限问题,可以对数据库对象进行访问控制,可以灵活的隔离数据,oracle已经实现了VPD,可以直接使用,比在应用层权限控制实现起来较方便,权限维护也比容易。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表的所有的行数据的。

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值