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

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


1458 Глава 21

6 g sel pred varchar2(1024) default NULL;

7 g upd pred varchar2(1024) default NULL;

8 g ins del pred varchar2(1024) default NULL;

Константа G APP CTX содержит имя контекста приложения. Если когда-либо потребуется переименовать контекст, можно изменить значение этой, используемой в oc-тальномкоде константы. Если придется это имя менять, достаточно будет поменять значение константы в одном месте и перекомпилировать тело пакета. Остальные три глобальные переменные будут содержать условия. Этот пример создавался для версии Oracle 8.1.6. В этой версии есть проблема, связанная с кэшированием курсоров и средствами тщательного контроля доступа (подробнее см. в разделе Проблемы далее). Начиная с версии Oracle 8.1.7, этот прием программирования использовать необязательно. В данном случае реализуется правило, запрещающее менять роль после регистрации. Однажды сгенерированные в сеансе условия возвращаются для всех запросов. Мы не будем заново генерировать их для каждого запроса, так что любые изменения роли не повлияют на результат, пока пользователь не завершит сеанс и не зарегистрируется снова (или не сбросит состояние сеанса с помощью вызова DBMS SESSION.RESET PACKAGE).

Теперь перейдем к первой из генерирующих условие функций. Она генерирует ус ловие для операторов SELECT, которые обращаются к представлению ЕМР. Обрати внимание, что она просто устанавливает значение глобальной переменной пакета G SEL PRED (Global SELect PREDicate - глобальное условие для SELECT) в зависимости от значения атрибута контекста RoleName. Если атрибут контекста не установлен, функция возбуждает исключительную ситуацию, которая приводит к неудачному завершению запроса:

11 function select function(p schema in varchar2,

12 p object in varchar2) return varchar2

13 is

14 begin

16 if (g sel pred is NULL)

17 then

18 if (sys context(g app ctx, RoleName) = EMP)

19 then

20 g sel pred:=

21 empno=sys context ( g app ctx ,EmpNo );

22 elsif (sys context(g app ctx, RoleName) = MGR)

23 then

24 g sel pred :=

2 5 empno in (select empno

26 from emp base table

27 start with empno =

2 8 sys context(g app ctx,EmpNo)

2 9 connect by prior empno = mgr) ;

31 elsif (sys context(g app ctx, RoleName) = HR REP)



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

32 then

33 g sel pred := deptno in

34 (select deptno

35 from hr reps

36 where username =

37 sys context(g app ctx,UserName));

39 else

40 raise application error(-20005, Роль не установлена);

41 end if;

42 end if;

44 return g sel pred;

45 end; 46

Теперь перейдем к функции, возвращающей условие для операторов изменения. Алгоритм ее очень похож на алгоритм предыдущей функции, но условие возвращается другое. Обратите на использование условия 1=0, например, если атрибут RoleName имеет значение ЕМР. Рядовые сотрудники ничего изменять не могут. Руководители могут изменять записи своих подчиненных (но не собственную запись). Ответственные за кадры могут изменять записи всех сотрудников отдела, которым они занимаются:

47 function update function(p schema in varchar2,

48 p object in varchar2) return varchar2

49 is

50 begin

51 if (g upd pred is NULL)

52 then

53 if (sys context(g app ctx, RoleName) = EMP)

54 then

55 g upd pred := l=0;

57 elsif (sys context(g app ctx, RoleName) = MGR)

58 then

59 g upd pred :=

60 empno in (select empno

61 from emp base table

62 where mgr =

63 sys context(g app ctx

64 , EmpNo)); 65

66 elsif (sys context(g app ctx, RoleName) = HR REP)

67 then

68 g upd pred := deptno in

69 (select deptno

70 from hr reps

71 where username =

72 sys context(g app ctx,UserName));

74 else

75 raise application error(-20005, Роль не установлена)



1460

Глава 21

76 77 78 79

80 end;

end if;

end if;

return g upd pred;

Наконец, рассмотрим функцию для операторов INSERT и DELETE. B этом случае условие 1=0 возвращается для пользователей с ролями ЕМР и MGR: никто из них не может создавать и удалять записи - это прерогатива ответственных за кадры (пользователей с ролью HR REPS):

82 function insert delete function(p schema in varchar2 ,

83 p object in varchar2) return varchar2

84 is

85 begin

86 if (g ins del pred is NULL)

87 then

8 8 if (sys context(g app ctx, RoleName ) in ( EMP,

89 then

90 g ins del pred := l=0;

91 elsif (sys context(g app ctx,

92 then

93 g ins del pred := deptno

94 (select deptno

95 from hr reps

96 where username =

97 sys context(g app ctx ,UserName)) ;

98 else

99 raise application error(-20005, Роль не установлена);

100 end if;

101 end if;

102 return g ins del pred;

103 end; 104

105 end;

106 /

RoleName)

HR REP)

Package body created.

До появления средств тщательного контроля доступа обеспечить применение этих трех условий при работе с одной таблицей можно было только за счет использования многочисленных представлений - по одному для операторов SELECT, UPDATE и INSERT/DELETE для каждой роли. Средства тщательного контроля доступа позволяют создать всего одно представление с динамически формируемыми условиями.

Последний шаг в решении задачи - связывание условий с каждой операцией МД и представлением ЕМР. Это делается следующим образом:

tkyte@TKYTE816> begin

2 dhmsrls. addpolicy

3 (objectname => EMP,

4 policy name => HR APP SELECT POLICY,

5 policy function => HR PREDICATE PKG.SELECT FUNCTION,



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

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