【问题标题】:Postgres: auto-populating an `INSERT` field based on session variablePostgres:根据会话变量自动填充“INSERT”字段
【发布时间】:2021-04-04 20:52:12
【问题描述】:

我有一个由 Postgres 支持的网络应用程序。

  • 每个 Web 应用请求只能读取/写入当前登录用户的数据。
  • 每个包含用户数据的表都有一个user_id 列。

我偶尔会遇到忘记将user_id = ? 添加到SQL 请求的WHERE 子句的错误。为了以一般方式防止此问题,我正在研究 Postgres 行级安全性 (article):

  • 为每个用户数据表设置策略:CREATE POLICY table_policy ON table USING (user_id::TEXT = current_setting('app.user_id'))
  • 在 Web 应用程序中,当请求开始时,在请求的连接上设置当前登录的用户 ID:SET app.user_id = ?

这让我在编写SELECTUPDATE 请求时可以完全忽略user_id

我剩下的问题是INSERTs。有没有办法避免在INSERTs 上提供user_id

【问题讨论】:

    标签: postgresql row-level-security


    【解决方案1】:

    看看manual

    根据 USING 中指定的表达式检查现有表行,而通过 INSERT 或 UPDATE 创建的新行 对照 WITH CHECK 中指定的表达式进行检查

    除了USING 子句之外,您似乎只需要在您的策略中添加一个WITH CHECK 子句,这将适用于 INSERT 和 UPDATE 语句。

    【讨论】:

    • 是的,INSERT 语句将被检查——如果我的INSERT 指定了错误的user_id,它将被适当地拒绝。但我正在寻找的是一种甚至不必在我的INSERTs 中提供user_id 的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2021-05-12
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多