cd6e8416

Контексты


Идея, лежащая в основе использования контекстов, очень проста и обеспечивает серьезную защиту. В исходном виде ее можно определить тремя особенностями: (i) контекст- список переменных в памяти, значения которых привязаны к сеансам, (ii) сеанс может получить текущие значения этих переменных, вызывая функцию sys_context(), (iii) переменные в контексте могут устанавливаться только путем вызова процедуры, связанной с этим контекстом. Например, используя служебную таблицу защиты, можно переписать предыдущий код следующим образом:

create or replace context security_ctx using security_proc; -- Процедура, защищающая контекст. -- Это может быть процедура пакета.

create or replace procedure security_proc as m_group_id varchar2(32); begin -- должна включать обработку исключительных ситуаций select group_id into m_group_id from security_table -- эту таблицу надо создать. where user_name = user; dbms_session.set_context( namespace => 'SECURITY_CTX', attribute => 'GROUP_ID', value => m_group_id ); end; /

create or replace trigger pt_bri before insert on public_table for each row begin :new.owner := sys_context('security_ctx','group_id'); -- должна включать перехват ошибок, например, null-значений end; /

create or replace view private_view as select id, v1 from public_table where owner = sys_context('security_ctx','group_id');

grant insert, select, update, delete on private_view to public;

При наличии этого кода, представление private_view ведет себя практически так же, как раньше. Пользователи, вставляющие данные в представление, автоматически получают при этом присоединенный к строке код группы. Пользователи, запрашивающие представление, увидят только строки, соответствующие коду их грруппы. Но, в этой реализации пока есть пробел. Как код группы пользователей устанавливается в их локальном контексте?

Для завершения картины надо использовать триггеры на регистрацию. Например, в схеме, в которой создана таблица, процедура и представление, можно выполнить следующий код:



Содержание раздела