|
Программирование >> Oracle
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;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |