我是靠谱客的博主 如意帆布鞋,这篇文章主要介绍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配置级别的管理功能,如有问题,可留言交流。

最后

以上就是如意帆布鞋最近收集整理的关于Oracle精细化权限访问控制的全部内容,更多相关Oracle精细化权限访问控制内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部