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

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


1452

Глава 21

tkyte@TKYTE816> alter table emp base table

2 add constraint

3 emp ename unique unique(ename) ; Table altered.

Теперь создадим представление ЕМР для таблицы EMP BASE TABLE. Правила защиты будут задаваться для этого представления, а приложение будет обращаться к нему для получения, вставки, изменения и удаления данных. Зачем используется представление, я объясню чуть позже:

tkyte@TKYTE816> create view emp as select * from emp base table;

View created.

Теперь создадим таблицу для хранения информации о сотрудниках, ответственных за кадровые вопросы в отделах. Для этого используем таблицу, организованную по индексу. Поскольку к таблице будет выполняться единственный запрос, SELECT * FROM HR REPS WHERE USERNAME = :X AND DEPTNO = :Y, таблица традиционной структуры нам не нужна:

tkyte@TKYTE816> create table hr reps

2 (username varchar2(30) ,

3 deptno number,

4 primary key(username,deptno)

6 organization index; Table created.

Теперь зададим ответственных за кадровые вопросы в отделах:

tkyte@TKYTE816> insert into hr reps values (KING, 10); 1 row created.

tkyte@TKYTE816> insert into hr reps values( KING , 20); 1 row created.

tkyte@TKYTE816> insert into hr reps values (KING, 30); 1 row created.

tkyte@TKYTE816> insert into hr reps values (BLЖE, 10); 1 row created.

tkyte@TKYTE816> insert into hr reps values (BE , 2 0); 1 row created. tkyte@TKYTE816> commit; Commit complete.

Теперь, когда таблицы приложения, ЕМР, DEPT и HR REPS, созданы, создадим процедуру, которая позволит устанавливать контекст приложения. Он будет содержать три атрибута: номер (EMPNO) текущего зарегистрированного пользователя, имя пользователя (USERNAME) и роль пользователя в приложении (ЕМР, MGR или HR REP). При создании конструкции WHERE для выполняемых пользователем операторов фун-



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

кция, динамически формирующая условие, будет использовать роль, хранящуюся в контексте приложения.

Для определения роли используется информация из таблиц EMP BASE TABLE и HRREPS. Вот вам и ответ на вопрос, зачем создавать таблицу EMP BASE TABLE и отдельное представление ЕМР как SELECT * FROM EMP BASE TABLE. Для этого имеются две причины:

данные в таблице сотрудников используются для реализации правил защиты;

данные из этой таблицы считываются при попытке задать контекст приложения.

Для чтения данных о сотрудниках необходимо настроить контекст приложения, но для настройки контекста приложения необходимо получить данные о сотрудниках. Это проблема определения, что первично: курица или яйцо? Мы создадим представление (ЕМР), к которому будут обращаться все приложения, и обеспечим защиту этого представления. Исходная таблица EMP BASE TABLE будет использоваться функцией, реализующей правила защиты. По таблице EMP BASE TABLE можно определить, кто является руководителем отдела и кто у него в подчинении. Приложения и пользователи никогда не будут обращаться к таблице EMP BASE TABLE - только функция, реализующая правила защиты. Для этого мы не будем предоставлять другим пользователям прав доступа к базовой таблице; при этом невозможность работы с ней обеспечит сервер.

В этом примере мы выбрали автоматическую установку контекста приложения при регистрации. Это стандартная процедура, если ее можно использовать, для автоматической настройки контекста приложения. Иногда этого недостаточно. Если при регистрации не хватает информации для определения того, каким должен быть контекст, придется установить его атрибуты вручную с помощью вызова соответствующей процедуры. Это часто приходится делать при использовании сервера приложений, подключающего всех пользователей к базе данных через одну совместно используемую учетную запись. Сервер приложений вызовет процедуру базы данных, передав ей имя реального пользователя для правильной настройки контекста.

Ниже представлена написанная нами процедура для установки значений атрибутов контекста. Мы знаем все особенности ее работы, поэтому можем ей доверять. Она позволяет реализовать необходимые правила защиты, устанавливая в контексте только соответствующее имя пользователя, название роли и номер сотрудника. В дальнейшем при обращении к этим значениям можно быть уверенными в том, что они заданы правильно и безопасно. Процедура будет автоматически выполняться триггером ON LOGON. B такой реализации процедура позволяет поддерживать З-уровневые приложения, использующие пул подключений и всего одну учетную запись в базе данных. Необходимо предоставить право на выполнение этой процедуры учетной записи, используемой пулом подключений, а затем на сервере приложений выполнять эту процедуру, причем не используя стандартное значение - имя текущего пользователя, подключившегося к базе данных, а передавая имя пользователя как параметр.

tkyte@TKYTE816> create or replace

2 procedure set app role(p username in varchar2

3 default sys context(userenv,session user))

4 as



1454

Глава 21

5 l empno number;

6 l cnt number;

7 1 ctx varchar2(255) default Hr App Gtx;

8 begin

9 dbms session.set context(l ctx, UserName, p username);

10 begin

11 select empno into l empno

12 from emp base table

13 where ename = p username;

14 dbms session.set context(l ctx, Empno, l empno);

15 exception

16 When NO DATA FOUND then

17 - Пользователя нет в таблице emp - это, должно быть, -> ответственный за кадры.

18 NULL;

19 end;

22 - Сначала посмотрим, не является ли этот пользователь -> ответственным за кадры; если нет -

23 - вдруг это руководитель; в противном случае устанавливаем -> пользователю роль ЕМР.

25 select count(*) into l cnt

26 from dual

27 where exists

28 (select NULL

29 from hr reps

30 where username = p username

31 );

33 if (l cnt о 0)

34 then

35 dbms session.set context(l ctx, RoleName, HR REP);

36 else

37 - Проверим, не является ли пользователь руководителем. 3 8 - Если нет, он получает роль ЕМР.

40 select count(*) into l cnt

41 from dual

42 where exists

43 (select NULL

44 from emp base table

45 where mgr = to number(sys context(l ctx,Empno))

46 );

47 if (l cnt о 0)

48 then

49 dbms session.set context(l ctx, RoleName, MGR);

50 else

51 - Роль ЕМР может получить каждый.

52 dbms session.set context(l ctx, RoleName, ЕМР) ;

53 end if;



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

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