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

1 ... 386 387 388 [ 389 ] 390 391 392 ... 469


1590 Приложение А

Их можно использовать для загрузки файла activation8i.zip, который используется также в разделе приложения А, посвященном пакету UTLSMTP. Более детальную информацию об интерфейсе JavaMail можно найти на странице http: java.sun.co products/javamail/index.html. Рассмотрим пример:

isTKYTEJlO exec dbms java.loadjava(-r -v -f -noverify -synonym -g -> public c:\temp\activation8i.zip) initialization complete

loading : com/sun/activation/registries/LineTokenizer creating : com/sun/activation/registries/LineTokenizer loading : com/sun/activation/registries/MailcapEntry creating : com/sun/activation/registries/MailcapEntry loading : com/sun/activation/registries/MailcapFile creating : com/sun/activation/registries/MailcapFile loading : com/sun/activation/registries/MailcapParseException creating : com/sun/activation/registries/MailcapParseException

Процедуры управления правами

Это весьма странные процедуры. Выполните команду DESCRIBE для пакета DBMS JAVA в базе данных и поищите в результатах упоминание о процедуре GRANT PERMISSION. Вы его не найдете, хотя точно известно, что такая процедура должна быть (я несколько раз демонстрировал ее использование). Она существует, как и ряд других функций, связанных с правами доступа. Я опишу использование подпрограмм GRANT PERMISSION/REVOKE PERMISSION. Подробное описание использования процедур управления правами и всех соответствующих опций можно найти в руководстве Oracle Java Developers Guide. Процедуры управления правами описаны в главе 5, Security for Oracle Si Java Applications, этого руководства.

В Oracle 8.1.5 точность установки привилегий для Java была очень низкой. Можно было указать только JAVAUSERPRIV или JAVASYSPRIV. Это напоминает ситуацию, когда в базе данных имеются только роли RESOURCE и DBA - обе они предоставляют пользователям слишком много возможностей. В версии Oracle 8.1.6 реализация Java в базе данных поддерживает классы защиты Java 2. Теперь имеется очень детальный набор привилегий, которые можно избирательно предоставлять и отбирать, аналогично набору привилегий в базе данных. Описание и обсуждение соответствующих классов привилегий можно найти на Web-странице http: java.sun.eom/j2se/l.3/docs/api/java/ security/Permission.html.

Итак, для установки привилегий будем использовать две процедуры - GRANT PERMISSION и REVOKE PERMISSION. Вопрос в том, как определить необходимые привилегии? Проще всего установить Java-код, выполнить его и узнать, чего ему не хватает для нормальной работы. Например, обратимся к разделу, посвященному пакету UTL SMTP. В нем я создаю хранимую процедуру SEND для посылки сообщения по электронной почте. Я также демонстрирую там, какие две привилегии необходимо предоставить с помощью процедуры GRANT PERMISSION, чтобы процедура SEND заработала. Необходимые привилегии я определил именно так - выполняю SEND и читаю сообщения об ошибках. Например:



Пакет DBMS JAVA

1591

tkyte@TKYTE816> set serveroutput on size 1000000 tkyte@TKYTE816> exec dbms java.set output(1000000) PL/SQL procedure successfully completed. tkyte@TKYTE816> declare

10 11 12 13

15 16 17 18

ret code number; begin

ret code

if ret code

dbms output.put line

else

dbms output.put line end if;

send(

p from => me@here.com, p to => me@here.com, p cc => NULL, p bcc => NULL,

p subject => Use the attached Zip file, p body => to send email with attachments....,

p smtp host = > aria.us.oracle.com , p attachment data => null, p attachment type => null,

p attachment file name => null);

1 then

(Сообщена послано успешно...) ;

20 end;

21 /

(Послать сообщение не удалось...);

the Permission (java.util.Property

java.security.AccessControlException: Permission * read,write) has

not been granted by dbms java.grant permission to SchemaProtectionDomain(TKEPolicyTableProxy(TKYTE))

Все предельно ясно. В сообщениях говорится, что пользователю TKTE необходима привилегия java.util.PropertyPermission с именем * и параметрами read и write. Вот

откуда я узнал, что надо выполнить:

s@TK\TE816> begin

2 dbms java.grant permission(

3 grantee => TKYTE,

4 permission type => java.util.PropertyPermission,

5 permission name => *,

6 permission action => read,write

7 ) ;

После этого при попытке выполнения я получил следующее сообщение об ошибке:

java.security.AccessControlException: the Permission (java.net.SocketPer mission aria.us.oracle.com resolve) has not been granted by dbms java.grant permission to

SchemaProtectionDomain(TKEPolicyTableProxy(TKYTE))

Предоставив соответствующую привилегию, я узнал, что кроме RESOLVE необходима привилегия CONNECT. Вот почему я выполнил:

8 dbms java.grant permission(

9 grantee => TKYTE,

10 permission type => java.net.SocketPermission,



1592

Приложение А

11 permission name => *,

12 permission action => connect,resolve

13 );

14 end;

15 /

И получил все необходимые соответствующей схеме привилегии. Обратите внимание, что в качестве значения permission name я задал *, чтобы процедура могла разрешать имя любого хоста и подключаться к любому хосту, а не только к моему серверу SMTP.

Процедура REVOKE PERMISSION выполняет действие, обратное GRANT PERMISSION

Она работает именно так, как ожидалось. Если передать те же параметры, что бхли переданы процедуре GRANT PERMISSION, она отберет соответствующую привилегию у текущей схемы.

Резюме

В этом разделе мы рассмотрели использование средств пакета DBMS JAVAдля выполнения различных действий, необходимых для поддержки Java-кода. Мы начали с описания того, как сервер Oracle, ограничивающий длину имен 30 символами, обрабатывает очень длинные имена, используемые в языке Java. Для каждого длинного имени Java-сервер создает уникальный 30-символьный идентификатор с помощью хеширования. Пакет DBMS JAVA предоставляет функцию преобразования короткого имени в соответствующее ему длинное имя и функцию преобразования длинного имени в короткое с помощью хеширования.

Затем было рассмотрено использование средств пакета DBMS JAVA для установки, получения и сброса опций компилятора Java. Мы разобрались, как таблица JAVA$OPTIONS используется для постоянного хранения стандартных опций компилятора и как вернуть этим опциям стандартные значения. Затем мы кратко рассмотрели процедуру SET OUTPUT. Она перенаправляет вывод результатов вызовов System.out.println в Java-коде в сеанс SQL*Plus или SVRMGRL, аналогично тому, как команда SET SERVEROUTPUT ON обеспечивает выдачу результатов вызовов процедур PL/SQL-пакета DBMS OUTPUT. Мы также рассмотрели альтернативный способ загрузки (с помощью вызова хранимой процедуры) исходного кода на языке Java, файлов классов и Java-архивов, ставший возможным благодаря пакету DBMS JAVA в версиях Oracle8i Release 2 (8.1.6) и выше. Наконец, мы изучили процедуры управления правами доступа, предоставляемые этим пакетом в версиях, начиная с Oracle8i Release 2. Эти процедуры позволяют гибко управлять привилегиями для Java-кода, устанавливая, что они могут и чего не могут делать.

Если вы используйте язык Java в базе данных Oracle, то постоянно будете применять эти процедуры при программировании.



1 ... 386 387 388 [ 389 ] 390 391 392 ... 469

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