通过 LDAP 身份验证与 Oracle 数据库连接

时间:2021-07-09 13:57:00

标签: python oracle11g ldap database-connection cx-oracle

我正在使用 python 的 pyodbc 库来连接 Oracle 数据库。对我的非生产服务器的身份验证设置为基本身份验证,因此我的连接字符串运行良好。

一开始很难理解和设置正确的驱动程序,但后来确实成功了。以下是用于连接的代码,并且在我的其他服务器上运行良好。

import textwrap
import pyodbc
connection_string = textwrap.dedent('''Driver={driver};
            DBQ={hostname}:{port}/{sid};
            UID={username};
            PWD={password};
            Connection Timeout=30;
            Trusted_Connection="yes"
        '''.format(driver = 'Oracle in instantclient_11_2', 
                    hostname = <hostname>, 
                    port = <port>,
                    sid = <sid>,
                    username = <username>,
                    password = <passwd>
                    ))

connection = pyodbc.connect(connection_string)

令我惊讶的是,PROD 仅通过 LDAP 进行身份验证。我拥有 LDAP 服务器、上下文和数据库服务以及凭据。

我尝试将连接字符串创建为

connection_string = textwrap.dedent('''Driver={driver};
            DBQ={hostname}:{port}/{sid};
            UID={username};
            PWD={password};
            Connection Timeout=30;
            Authentication=LDAP;
            Trusted_Connection="yes"
        '''.format(driver = 'Oracle in instantclient_11_2', 
                    hostname = <ldap_server>, 
                    port = 389,
                    sid = <db_service>,
                    username = <username>,
                    password = <passwd>
                    ))

知道它行不通,我并不感到惊讶。尝试通过许多链接但无法通过。有没有人以前试过这个,或者请让我知道我必须缺少什么。

我绝对可以使用 LDAP 身份验证在 SQL Developer 中进行连接。由于此服务器上未配置 TNS 侦听器,因此我无法使用基本身份验证进行连接。

欢迎在这方面提供帮助。

1 个答案:

答案 0 :(得分:0)

设置 Oracle 驱动程序 - (这是一个先决条件,如果存在请忽略)

  1. 下载适用于 Microsoft Windows (x64) 64 位的 Oracle Instant Client。或者下载适用于您的 32 位系统。

  2. 选择您的 Oracle 数据库版本。我的版本是 11.2.0.4.0

  3. 下载以下文件 - 一世。即时客户端包 - 基本 ii.即时客户端包 - ODBC

  4. 将两个软件包解压到同一目录中,例如 C:\oracle\instantclient_19_3。

  5. 从 Instant Client 目录执行 odbc_install.exe。如果 Instant Client 是 11g 或更低版本,请使用管理员权限启动命令提示符。

  6. 创建 C:\oracle\instantclient_19_3\network\admin 文件夹以放置 tnsnames.ora、sqlnet.ora。

  7. 将环境变量 - TNS_ADMIN 设置为上述文件夹位置。

  8. C:\oracle\instantclient_19_3 添加到 PATH 环境变量。

  9. C:\oracle\instantclient_19_3 添加到 ORACLE_HOME(可选,如果连接不起作用,请尝试此操作。)

LDAP 身份验证

  1. 创建两个文件:sqlnet.oraldap.ora
ldap.ora
# Place this file in the network/admin subdirectory or your 
# $ORACLE_HOME location.
# LDAP Server name should be added here. Rest all the values remains unchanged.
DIRECTORY_SERVERS = (your-server.your-organization:389:636)    
DEFAULT_ADMIN_CONTEXT = "ldap-ou-designation"
DIRECTORY_SERVER_TYPE = OID
sqlnet.ora
# Place this file in the network/admin subdirectory or your 
# $ORACLE_HOME location.
SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH = (LDAP)
  1. 验证 C:\oracle\instantclient_19_3 是否存在于路径中,否则尝试更新 Python 代码中的路径,如下所示
import os
lib_dir=r"C:\oracle\instantclient_19_3"
os.environ["PATH"] = lib_dir + ";" + os.environ["PATH"]

  1. 完成所有这些设置后,您应该拥有 用户名、密码和数据库服务名称让我们在此处将其称为 db_service

使用 cx_Oracle

import cx_Oracle
con = cx_Oracle.connect('{0}/{1}@{2}'.format(user, password, db_service))

version_script = "SELECT * FROM v$version"
cursor = con.cursor()
cursor.execute(version_script)
version = cursor.fetchall()
print(version[0][0])

Ouput
-----
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

使用 pyodbc

import pyodbc
con = pyodbc.connect('Driver={0};DBQ={1};UID={2};PWD={3}'.format(driver, db_service, user, password))

version_script = "SELECT * FROM v$version"
cursor = con.cursor()
cursor.execute(version_script)
version = cursor.fetchall()
print(version[0][0])

Ouput
-----
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

#Drivers for pyodbc 
pyodbc.drivers()

Output
------
['ODBC Driver 17 for SQL Server',
 'Oracle in instantclient_11_2']

参考资料:

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html https://www.oracle.com/database/technologies/releasenote-odbc-ic.html https://eikonomega.medium.com/connecting-to-oracle-database-with-cx-oracle-and-ldap-5da7925a305c