Oracle精细化权限访问控制

一、需求

        对oracle访问用户,查询数据权限进行精准控制,

        用户“XXU01” 查询数据时,只能查出 字段“HOSID = 001” 的数据;

二、实现方式

1. 创建用户XXU01、指定表空间

conn sys,system

CREATE USER XXU01 IDENTIFIED BY "1234" DEFAULT TABLESPACE DBMSRLS TEMPORARY TABLESPACE DBMSRLS_TEMPORARY PROFILE DEFAULT;
GRANT CONNECT,RESOURCE, CREATE ANY VIEW TO XXU01;

2.将表数据权限 赋给权限管理用户 XXU01

DECLARE
  CURSOR CSR IS
    SELECT TABLE_NAME FROM ALL_TAB_COMMENTS WHERE OWNER = 'DBMSU';
  C_ROW CSR%ROWTYPE;
BEGIN
  FOR C_ROW IN CSR LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT,INSERT,UPDATE,DELETE ON DBMSU.'||C_ROW.TABLE_NAME||' TO XXU01';
  END LOOP;
  COMMIT;
END;

3. 创建函数,功能是根据登录用户 识别,处理对应select.......where条件子句 

CREATE 
  OR REPLACE FUNCTION F_SELECT_DATA_SECURITY ( P_USER VARCHAR2, P_TABLE VARCHAR2 ) RETURN VARCHAR2 IS RESULTS VARCHAR2 ( 255 );
BEGIN
  IF
    USER = 'XXU01' THEN
    RETURN 'HOSID = (SELECT HOSID FROM DBMSU.RLS_USERS WHERE USERNAME=SYS_CONTEXT(''USERENV'',''SESSION_USER''))';
  END IF;
	RETURN '1=1';
END;

 4.创建策略,功能是当查询指定表数据时 执行以上函数

DECLARE
  V_CCOUNT VARCHAR2(100);
  CURSOR C_SADD IS
    SELECT TABLE_NAME FROM ALL_TAB_COMMENTS WHERE OWNER = 'DBMSU' AND TABLE_NAME <> 'RLS_USERS';
  C_ROW C_SADD%ROWTYPE;
BEGIN
  FOR C_ROW IN C_SADD LOOP
    DBMS_RLS.ADD_POLICY ( OBJECT_SCHEMA => 'DBMSU', OBJECT_NAME => C_ROW.TABLE_NAME, POLICY_NAME => 'SELECT_DATA_SECURITY', POLICY_FUNCTION => 'F_SELECT_DATA_SECURITY' );
  END LOOP;
  COMMIT;
END;

5.创建权限关系表(初始数据)

CREATE TABLE RLS_USERS(ID NUMBER,USERNAME VARCHAR2(255),HOSID VARCHAR2(20));
INSERT INTO RLS_USERS VALUES(1,'XXU01','001');

关系表数据,根据用户与hosid关系,持续追加维护即可

总结:以上5步即可实现 登录某用户,查询数据,根据相关权限id,进行精细化权限过滤,属于DB配置级别的管理功能,如有问题,可留言交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值