python - 使用 Oracle 客户端和 Kerberos 与 Python 连接到数据库

标签 python python-3.x database oracle kerberos

我有一个 python 脚本,它基本上使用 x_Oracle oracle 客户端连接到我的数据库服务器,连接后我可以运行我的 SQL 查询。

现在,由于我的数据库凭据已过期,我被迫使用我不知道的 kerberos 身份验证。以前只需执行以下代码即可工作:

conn_str = u'username/password@dbx1.ct.com:1521/dbx1.ct.com'
    conn = cx_Oracle.connect(conn_str)
    c = conn.cursor()
    c.execute(
        "select DISTINCT ITEM_ID,  UOM,  from SMCFS93 where item = '" + item + "'")
    for row in c:
        print(row)

但现在我需要使用 kinit 生成票证,并且我有一个 C:\kerberos\krb5.conf 文件和一个 C:\krb5cc_User 文件在 SQL Developer 中给出了路径位置,然后我可以连接到我的数据库服务器。

如果想使用 SQL 开发人员连接到数据库,该方法可以正常工作,但我无法了解如何在 Python 中实现此操作。

我尝试创建一个子进程来每次进入 kinit 并生成票证,并在 stackoverflow 上尝试了一些答案,但我无法连接到我的数据库。任何有关如何使用 kerberos 连接数据库服务器的建议都会有很大帮助。

最佳答案

使用以下命令从 Python 连接到 Oracle:

  • Oracle Instant Client 的 OCI 版本
  • 通过 Windows keystore 的 Kerberos
  • jaydebeapi 和 jpype Python 库

好处:

  • 无需手动输入用户名/密码即可生成 Kerberos 票。
  • 使用事件 Windows session 的凭据进行身份验证 Windows keystore 。
  • 无需跟踪和保护 Kerberos key 文件
  • 其他应用程序(SQL*Plus、SQL Developer 等)可以重复使用相同的内容 Kerberos 配置
  • krbcontext Python 库完全是 不必要。因此,Windows 机器上不需要 Docker。

步骤:

  1. 从 IT 人员处获取(或创建一个)适用于您的 Windows 域的 krb5.conf
  2. 通过在 Instant Client 的\network\admin 子目录中创建 sqlnet.ora 文本文件,将 Oracle Instant Client 配置为使用 Kerberos 身份验证。文件内容:

    SQLNET.KERBEROS5_CONF={Path to your Krb5.conf file}
    SQLNET.KERBEROS5_CONF_MIT=TRUE
    SQLNET.AUTHENTICATION_SERVICES=(KERBEROS5PRE)
    SQLNET.KERBEROS5_CC_NAME=OSMSFT:
    
  3. 验证 Instant Client 是否已正确配置 Kerberos。以下命令将连接服务器并进行身份验证,而不提示您输入用户名和密码。 (请勿将“/”替换为您的用户名和密码。)

    sqlplus.exe/@server:port/SID

  4. 确保 Oracle Instant Client 根目录位于您的环境路径中。否则 jaydebeapi.connect 命令将抛出以下错误:java.lang.UnsatisfiedLinkError: no ocijdbc19 in java.library.path

  5. 使用 JDBC 在 Python 中连接

    args = "-Djava.class.path=" + {jdbc_jar_file_path}
    jpype.startJVM(args, convertStrings = False)
    
    connection_string = 'jdbc:oracle:oci:/@server:port:sid'
    jaydebeapi.connect(
      {jdbc_java_class_name}
    , connection_string
    , jars = {jdbc_jar_file_path}
    )
    

关于python - 使用 Oracle 客户端和 Kerberos 与 Python 连接到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56644611/

相关文章:

python - 在Python中,当队列不为空时从队列中读取数据并始终调用task_done的最干净的方法是什么?

python - 如何计算输出文件(写入 txt 文件的字符串列表)中的字母 N?

python-3.x - Lambdify 参数积分

sql - 在同一个表上组合两个 SQL SELECT 语句

python - Keras model.fit() 与 tf.dataset 失败,而使用 tf.train 工作正常

python - 生成大小为 n 的二进制数作为元组 : itertools. Product(*[(0, 1)] * n)

php - 如何从 php 调用 python 脚本

python - 在传递给 apply() 的自定义函数中访问先前计算的结果

database - Flyway 的迁移前和迁移后脚本

database - 创建太多数据库索引的权衡是什么?