导出中的访问规则

Postgres 导出包含行级安全策略,用来重现你的每个用户可以读取哪些行。你需要自行应用它们,并且它们只涵盖读取。

这些策略重现什么

该导出包包含 policies.sql,它在导出的表上设置行级安全。用户在以下情况可以看到一行:他们拥有它、它是公开的、他们被明确授予了它,或它依附于他们已经能看到的内容。最后一种情况只延伸一层,通过携带读取权限的引用。明确授予的权限保存在它们自己的表中,策略会查询这张表,而用户不能直接读取。

在 Fóir 内部,规则在数据库中强制执行,由 Demesne 针对单一的记录表编译而成。导出则是每个模型一张表,因此同样的规则要针对这种形态重新写一遍。

应用它们

数据加载完成后,你用 psql 运行该文件。通过导出命令应用导出包并不会运行它。此后,约定只有一个会话设置,request.jwt.claims,它携带用户的 id。没有设置 claims 时,调用方是匿名的,只能看到公开的行。请以 authenticated 角色进行测试:恢复这些表的角色拥有它们,而表的所有者会绕过行级安全。

哪些不会迁移

字段级权限、API 作用域和写入规则不会带走。能在恢复后的数据库中看到某一行的用户,会看到该行的所有列,因此隐藏字段就成了你的应用、列授权或视图的工作。这些策略只给匿名和已登录的调用方读取权限,你的团队在控制台中的访问权限不会导出。

测试了什么

我们的测试套件会导出一个已填充数据的项目,将其恢复到第二个数据库中,应用这些策略,并要求同一用户在两边得到相同的行 id。这测试的是转换,没有任何检查针对你自己恢复后的数据库上的策略。我们不声称恢复后的规则一致,对此不作保证的情形是项目使用组织。

阅读详情

导出指南中的访问规则一节展示了如何应用这些策略、设置用户的 claims,以及用正确的角色进行测试。