一、需求
对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精细化权限访问控制内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复