Я немного погуглил, но не нашел существенных результатов. Можно ли использовать аутентификацию на основе ключей для подключения к серверу Oracle с помощью Python? Моя цель состоит в том, чтобы иметь возможность автоматизировать некоторые отчеты, которые я делаю с помощью Python, без необходимости хранить имя пользователя/пароль где-либо на сервере.
Аутентификация с открытыми ключами и cx_Oracle с использованием Python
Ответы (2)
Одним из возможных решений является внедрение Oracle Wallet. Для создания записи в Oracle Wallet необходимо иметь:
- имя разрешения tnsname, установленное для указанного экземпляра
- имя пользователя и пароль
Пример: Oracle sid, с которым я работаю, называется ORCL, пользователь, с которым мне нужно соединиться, называется my_user. В вашем файле tnsnames.ora у вас уже есть запись, которая разрешает имя/sid службы ORCL, создайте еще одну с точно такими же параметрами:
#initial local name entry:
ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = my_ip)(PORT = 1528))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))
#create an additional local name entry:
ORCL_MY_USER = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = my_ip)(PORT = 1528))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))
После успешного разрешения новой записи создайте запись кошелька оракула для локального имени ORCL_MY_USER. Это новое локальное имя, которое вы собираетесь использовать в своем скрипте Python для подключения без указания или жесткого кодирования пароля.
Пример:
импорт cx_Oracle
db = cx_Oracle.connect("/@ORCL_MY_USER")
курсор = db.курсор()
r = cursor.execute("ВЫБРАТЬ имя пользователя, пароль, статус_учетной_записи, табличное_пространство по умолчанию, временное_табличное пространство из dba_users в порядке имени пользователя")
для имени пользователя, пароля, account_status, default_tablespace, временного_tablespace в курсоре:
print username, '\t', password, '\t', account_status, '\t', default_tablespace, '\t', temporary_tablespace
Да, вам нужно указать местоположение кошелька Oracle в sqlnet.ora.
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/product/11.2.0.2/dbhome_1/owm/wallets/oracle)))
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0
Насколько я понимаю, расположение кошелька Oracle по умолчанию находится в $ORACLE_HOME/owm/wallets/.