【发布时间】:2022-10-05 04:31:19
【问题描述】:
设置:
我使用psycopg2 访问我用SQL 构建的(PostgreSQL)数据库。
我希望有不同的用户,它们只能访问表中自己的行。因此,我为方案中的每个表添加了 UserId 属性。 UserId 的值可作为变量(让我们将其命名为pyUserId)在程序执行时提供。
我对curs.execute() 的所有调用都通过我定义的一个函数进行。
我想要达到的目标:
是否可以为每个查询集中设置属性值,例如UserId=pyUserId?
否则,我必须将 pyUserId 作为我已经构建的每个查询的数据传递,我怀疑这也违反了 DRY。
例如:SELECT UserName FROM Users WHERE Age < 30 变为:SELECT UserName FROM Users WHERE Age < 30 AND UserId = pyUserId
或者INSERT INTO Profiles (Name, Bio, SoAccount) VALUES ('jon', 'blah...', '22656') 变为INSERT INTO Profiles (Name, Bio, SoAccount, UserId) VALUES ('jon', 'blah...', '22656', pyUserId)
DELETE 等也一样。
我尝试了什么:
- 对于
INSERTit is possible 以动态更改 PostgreSQL DEFAULT 约束。但这仅适用于插入。 - 根据 psycopg2 文档中的string composition,我可以操作 SQL 查询字符串。但我想有很多陷阱,对 SQL 字符串进行操作。
- 但是,也许有一种方法可以通过操作准备好的语句或分析树来做到这一点。
- 我不确定这个想法是否可行。如果不是,请解释原因。
【问题讨论】:
-
有关信息,PostgreSQL 实现了row level security,它可以做任何想做的事(我认为),但是您需要以用户身份进行连接才能使其生效(尽管this answer 中链接的文章显示了一种可以完成的方法) .
-
行级安全性似乎是我想要的。尽管所有答案都为不同的用户推荐或期望不同的角色。对我来说,似乎有两种方法: 1. 为不同的用户实现角色。然后在官方文档中使用 RLS。 2. 使用签名的会话变量跟随答案。
标签: python postgresql psycopg2