|
Программирование >> Oracle
1492 Глава 22 тифицироваться один раз - на сервере приложений - и обеспечить доступ сервера приложений ко всем необходимым базам данных от нашего имени (или по нашему заданию), не передавая пароли для каждой базы данных? Именно это и обеспечивает многоуровневая аутентификация. На уровне базы данных для этого достаточно задать опцию подключения. В Oracle 8i оператор ALTER USER б1л изменен и поддерживает конструкцию GRANT CONNECT THROUGH (подробнее она рассматривается далее, в разделе Предоставление привилегии ). Рассмотрим доступ к базе данных затрат в представленном ранее приложении: Служба каталогов содержит информацию сопоставления, связывающую пользователя TomKyte с клиентом базы данных TKYTEUS. После успешного получения этой информации сервер приложений (промежуточный сервер) может подключаться к базе данных со своими реквизитами от имени клиента базы данных, TKYTE US. Серверу приложений при этом пароль пользователя TKYTE US знать не надо. Чтобы это можно б1ло сделать, администратор базы данных затрат должен предоставить учетной записи APPSERVER право подключаться от имени клиента: alter user tykte us grant connect through app server Сервер приложений будет работать в базе данных от имени и с привилегиями пользователя TKYTE US, как если бы пользователь TKYTE US зарегистрировался в базе данных непосредственно. Таким образом, сервер Oracle 8i расширяет модель защиты настолько, что сервер приложений может безопасно работать от имени клиента, не требуя от него пароля соответствующей учетной записи в базе данных и не запрашивая многочисленные привилегии для доступа к объектам или процедурам, которые ему непосредственно не нужны. Кроме того, система проверки также б1ла расширена и включает действия, выполняемые сервером приложений от имени клиента. Другими словами, мы можем узнать, выполнил ли сервер приложений определенное действие от имени клиента (подробнее об этом см. в разделе Проверка промежуточных учетных записей ). Многоуровневая аутентификация 1493 Теперь перейдем к обсуждению реализации этих возможностей. Как упоминалось во введении, это средство в настоящее время* доступно только для программ на языках С и С+ + , использующих средства Oracle Call Interface. Механизм многоуровневой аутентификации В этом разделе одна из стандартных демонстрационных программ OCI, реализующая мини-SQL*Plus, будет изменена для использования промежуточной аутентификации при подключении к базе данных. В результате получится небольшое, интерактивное средство выполнения SQL-операторов, которое позволит выяснить, как работает многоуровневая аутентификация и какие побочные эффекты при этом возникают. В качестве приза вы получите инструментальное средство, которое при наличии соответствующих привилегий позволит зарегистрироваться от имени другого пользователя и выполнять действия, регистрируемые системой проверки как ваши. Это средство можно, например, использовать для предоставления привилегии SELECT на таблицу другого пользователя, не зная его пароля. В демонстрационную программу cdemo2.c (которая находится в каталоге [ORACLE HOME]\rdbms\demo) придется добавить только другую процедуру регистрации. После этого мы сможем зарегистрироваться как пользователь SCO, используя аутентификацию операционной системой, и предоставить роль CONNECT: C:\> cdemo2 / scott )NNECT Можно также, например, зарегистрироваться, указав имя пользователя и пароль в удаленной по отношению к учетной записи SCOTT базе данных, и предоставить роли RESOURCE и PLUSTRACE: G:\> cdemo2 user/pass©database scott RESOURGE,PLUSTRAGE Для того чтобы показать, как регистрироваться с помощью механизма многоуровневой аутентификации, придется создать С-функцию - эту часть программы мы рассмотрим детально. Остальная же часть приложения - обычный OCI-код, ничем не отличающийся от любой программы, использующей библиотеку OCI. В начало кода включен стандартный заголовочный файл oci.h, находящийся в каталоге ORACLE HOME]\rdbms\demo. Этот файл содержит необходимые прототипы функций и макросов для всех OCI-программ. Затем объявляются локальные переменные для подпрограммы регистрации. Используются обычные дескрипторы подключений OCI, но обратите внимание на два дескриптора OCISession: один - для учетной записи, реквизиты которой будут передаваться (от имени которой выполняется регистрация), а второй - для учетной записи, от имени которой мы будем работать. Назначение остальных локальных переменных понятно из имен - они содержат имя пользователя, пароль, имя базы данных и все роли, которые мы хотим предоставить: #include <oci.h> void checkerr(OGIError * errhp, sword status); 1494 Глава 22 Lda Def connect8i(int argc, char * argv[]) { OCIEnv *environment handle; OCIServer *data server handle; OCIError *error handle; OCISvcCtx *application server service handle; OCISession *first client session handle; OCISession *application server session handle; char *username; char *password; char *database; char temp[255]; char role buffer[1024]; char *roles[255]; int пгсэ!; Проверим допустимость переданных функции аргументов командной строки. Если передано не четыре аргумента, значит, переданной информации недостаточно, т.е. просто выдается сообщение о правильном использовании, и работа завершается. В противном случае мы анализируем (с помощью стандартной С-функции strtok) переданные аргументы. Поскольку вызов strtok - деструктивный (он изменяет переданную функции строку), перед анализом аргументов мы копируем их в локальные переменные: if (argc != 4) printf( usage: %s proxy user/proxy pass real account name rolel,\n , argv[0]); printf( proxy user/proxy pass can just be /\n ); printf( real account name is what you want to connect to\n ); exit(l); strcpy(temp, argv[1]) ; username = strtok(temp, / ) ; password = strtok(NULL, @ ) ; database = strtok(NULL, ) ; strcpy( role buffer, argv[3] ); for (nroles = 0, roles[nroles] = strtok(role buffer, , ); roles[nroles] != NULL; nroles + +, roles[nroles] =strtok(NULL, , )) ; Теперь выполняем общую инициализацию и выделение контекстов. Это стандартные действия для всех ОС1-программ: OCIInitialize(OCI DEFAULT, NOLL, NULL, NULL, NULL); OCIEnvInit(&environment handle, OCI DEFAULT, 0, NULL); OCIHandleAlloc((dvoid *) enviroranent handle, (dvoid**) serror handle, OCI HTYPE ERROR, 0, NULL); Затем выделяем и инициализируем контексты сервера и службы, используемые сервером приложений . В данном случае сервером приложений является демонстрацион-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |