Программирование >>  Oracle 

1 ... 342 343 344 [ 345 ] 346 347 348 ... 469


Тщательный контроль доступа 1455

54 end if;

55 end;

56 /

Procedure created.

Создадим контекст приложения. Контекст будет иметь имя HR APP CTX (совпадающее с именем предыдущей процедуры). Создавая контекст, обратите внимание, как он привязывается к только что созданной процедуре, - только она сможет устанавливать значения атрибутов в этом контексте:

tkyte@TKYTE816> create or replace context Hr App Ctx using SET APP ROLE

2 /

Context created.

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

tkyte@TKYTE816> create or replace trigger APPLjOGONTRIGGER

2 after logon on database

3 begin

4 set app role;

5 end;

Trigger created.

Итак, мы создали процедуру, задающую роль для текущего зарегистрированного пользователя. Эта процедура будет вызываться не более одного раза за сеанс, гарантируя, что атрибут RoleName однократно получает значение при регистрации, которое затем не изменяется. Поскольку в зависимости от значения RoleName функция, реализующая правила защиты, будет возвращать различные значения, в версиях Oracle 8.1.6 и 8.1.6 нельзя разрешать пользователям изменять свою роль после установки. В противном случае возникнет потенциальная проблема с кэшированными курсорами и старыми условиями (см. описание соответствующей проблемы в разделе Проблемы далее в этой главе; в версии 8.1.7 проблема в основном решена). Кроме того, мы находим значение EMPNO для текущего пользователя. Это дает нам два преимущества.

Возможность проверить, является ли пользователь сотрудником. Получение сообщения об ошибке NO DATA FOUND позволяет судить, что подключившийся пользователь не является сотрудником. Поскольку его атрибут EMPNO не получает значения, этот пользователь не увидит данных, если только не является ответственным за кадры.

Часто используемое значение помещается в контекст приложения. Теперь можно быстро обратиться к таблице ЕМР по значению EMPNO для текущего пользователя, что мы и будем делать далее в функции, формирующей условия.

Затем мы создали объект (контекст приложения) и связали его с созданной ранее процедурой SET APP ROLE. В результате только эта процедура может устанавливать значения в данном контексте. Вот почему контекст приложения можно безопасно использовать и доверять получаемым результатам. Мы точно знаем, какой фрагмент кода может



1456

Глава 21

устанавливать значения в контексте, и мы уверены, что они устанавливаются правильно (ведь мы же сами написали эту процедуру). Следуюший пример показывает, что произойдет при попытке установить значения в контексте из другой процедуры:

tkyte@TKYTE816> begin

2 dbms session.set context(Hr App ctx,

3 RoleName, MGR);

4 end;

5 / begin

ERROR at line 1:

ORA-01031: insufficient privileges ORA-06512: at SYS.DBMS SESSION , line 58 ORA-06512: at line 2

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

tkyte@TKYTE816> connect smith/smith

smith@TKYTE816> column namespace format a10 smith@TKYTE816> column attribute format a10 smith@TKYTE816> column value format a10 smith@TKYTE816> select * from session context;

NAMESPAGE ATTRIBUTE VALUE

HR APP GTX ROLENAME EMP HR APP GTX USERNAME SMITH

HR APP GTX EMPNO 7369

Как видите, все работает, как и предполагалось. Пользователь SMITH успешно получил соответствующие значения атрибутов USERNAME, EMPNO и ROLENAME в контексте HR APP CTX.

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

smith@TKYTE816> connect blake/blake

blake@TKE816> declare

2 l AppGtx dbms session.AppGtxTabTyp;

3 l size number;

4 begin

5 dbms session.list context(l AppCtx, l size);

6 for i in 1 .. l size loop

7 dbms output.put(l AppCtx(i).namespace .) ;

8 dbms output.put(l AppCtx(i).attribute = );

9 dbms output.put line(l AppCtx(i).value);

10 end loop;

11 end;



Тщательный контроль доступа 1457

12 /

HR APP CROLENAME = HR REP HR APP CTX.USERNAME = BKE HR APP CTX.EMPNO = 7698

PL/SQL procedure successfully completed.

На этот раз мы зарегистрировались как пользователь BLAKE, который является руководителем отдела 30 и ответственным за кадры в отделах 10 и 30. После регистрации видно, что контекст установлен правильно: для пользователя установлена роль HR REP, имя пользователя и номер сотрудника. При этом показано, как получить пары атрибут/ значение из контекста сеанса с помощью процедуры DMBS SESSION.LIST CONTEXT. Этот пакет общедоступен, поэтому все пользователи смогут проверять значения атрибутов своего контекста с помощью этого метода, в дополнение к рассмотренному ранее

представлению SESSION CONTEXT.

Убедившись, что контекст сеанса устанавливается так, как предполагалось, можно переходить к созданию функций, реализующих правила защиты. Эти функции будут вызываться сервером во время выполнения для динамического добавления условия к операторам. Такие динамически формируемые условия ограничивают множество данных, которые пользователь может читать или записывать. Мы создадим отдельные функции для операторов SELECT, операторов UPDATE и операторов INSERT/DELETE. Дело в том, что каждый из этих операторов может обращаться к различным подмножествам строк. Выбирать можно больше данных, чем изменять (например, сотрудник может просматривать свою запись, но не может ее менять). Только специально назначенные пользователи могут вставлять и удалять строки, поэтому условия для этих операторов тоже отличаются:

blake@TKYTE816> connect tkyte/tkyte

tkyte@TKYTE816> create or replace package hr predicate pkg

2 as

3 function select function(p schema in varchar2,

4 p object in varchar2) return varchar2; 5

6 function update function(p schema in varchar2,

7 p object in varchar2) return varchar2; 8

9 function insert delete function(p schema in varchar2,

10 p object in varchar2) return varchar2;

11 end;

12 /

Package created.

Ниже представлена реализация пакета HR PREDICATE PKG. Начнем с глобальных переменн1х:

tkyte@TKYTE816> create or replace package body hr predicate pkg

2 as 3

4 g app ctx constant varchar2(30) default Hr App Ctx; 5



1 ... 342 343 344 [ 345 ] 346 347 348 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика