【发布时间】:2020-03-30 15:05:44
【问题描述】:
我正在开发一款使用 Postgres 作为后端的游戏。我一直在努力解决的功能之一是允许玩家编写游戏玩法的某些方面的脚本。这些脚本将存储在一个表(文本列)中,并且在每一轮结束时,这些脚本将由一个存储过程执行。
我可以从该表中选择脚本代码并使用如下语句运行它:
do [script-code-here] language whatever-pl-language;
--haven't decided which languages to allow, might give them choice of several
运行这些的存储过程将在适当的 postgres 角色下运行代码,该角色被锁定并具有足够的授权,它们只能影响它们应该能够影响的表(和列)。但是当然,其他玩家的数据会在同一张表中,所以我需要行级别的安全性,以便他们能够更新/删除/插入自己的行,而不会欺骗和修改对手的行。
Postgres 文档中的create policy 示例很少。我一直找不到一个不能简单检查 x = current_user 的 USING 子句(current_user 是代码运行的角色)。
如果我在脚本表中有一个 player_id 列,并且在所有其他表中脚本将被允许影响,有没有办法制定一个 create policy 语句,不会强迫我创建一个新的 postgres每个玩家的角色(其中可能有任意高的数字)?匿名代码块可以(例如)将一些变量设置为正在运行的脚本的 player_id,除了 set 语句可以设置自定义参数或变量。我也找不到一个可以重新调整用途并设置为这个值的不重要的值(它甚至看起来不像它们可以在 plsql 中引用)。
是否有一些功能或技巧可以让我使用我描述的表格/列来制定create policy 语句,而无需为每个玩家创建新角色? Postgres 扩展解决方案非常受欢迎。
【问题讨论】:
标签: postgresql stored-procedures row-level-security