【问题标题】:setting `client_identifier` via cx_Oracle and sqlalchemy通过 cx_Oracle 和 sqlalchemy 设置 `client_identifier`
【发布时间】:2018-07-21 07:05:36
【问题描述】:

我正在 Flask、sqlalchemy 和 cx_Oracle 之上运行一个 flask-rest-jsonapi 应用程序。该项目的一个要求是,通过 cx_Oracle (relevant documentation) 提供的连接属性 client_identifier 可以根据每个客户端请求在 JWT 中发送的值进行修改。我们需要能够写入此属性,因为我们的内部审计表利用它来跟踪单个用户所做的更改。

在 PHP 中,setting this value is straightforward 使用 oci8,过去对我们非常有用。

但是,我一直无法弄清楚如何使用这种新的应用程序结构设置相同的属性。在 cx_Oracle 中,client_identifier 属性是一个“只写”属性,因此如果不去后端并检查数据库会话属性,就很难验证该值是否设置正确。您可以通过 sqlalchemy raw_connection 对象访问此属性。

除了难以阅读之外,设置该值没有任何效果。我们从每个请求传入的 JWT 中获取所需的客户端标识符值,并尝试在原始连接对象上设置它。虽然设置值的操作不会引发错误,但该值不会显示在相关会话的后端,即在 db 端查看会话时,client_identifier 属性为空。

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

db = SQLAlchemy(app)

# the client_identifier property is available at db.engine.raw_connection()

# attempt to set the client_identifier property
raw_conn = db.engine.raw_connection()
raw_conn.client_identifier = 'USER_210'

# execute some sql using raw_conn.cursor()...
# the client identifier value on the db side for this request is null

上面显示的方法是设置client_identifier的正确方法吗?如果是这样,使用v$session 视图查询后端会话表时,为什么USER_210 没有列在client_identifier 列中?

【问题讨论】:

    标签: python flask sqlalchemy cx-oracle


    【解决方案1】:

    在纯 cx_Oracle 中,这对我有用:

    import cx_Oracle
    
    db = cx_Oracle.connect("system", "oracle", "localhost/orclpdb")
    db.client_identifier = 'this-is-me'
    cursor = db.cursor()
    cursor.execute("select username, client_identifier from v$session where username = 'SYSTEM'")
    v = cursor.fetchone()
    print(v)
    

    结果是:

    $ python3 q1.py 
    ('SYSTEM', 'this-is-me')
    

    我没有设置来测试您的确切场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2013-11-08
      • 2021-10-05
      • 2020-12-02
      相关资源
      最近更新 更多