在数据库中强制执行

Fóir 中谁可以读取或更改一行,由 Postgres 决定。规则只写一次,写在一份规范里,并编译为行级安全策略,因此检查与数据同在,位于应用代码之下。

一份规范,一次编译

访问模型保存在单个规范文件中。Demesne 是我们的开源编译器,它把规范转换成策略以及策略所调用的数据库函数。生成的 SQL 原样交付,与编译器写出的完全一致,没有人手工修改。截至撰写时,它管辖约一百张表。

强制执行,并对照实际的 schema 检查

每张受管辖的表上,行级安全不仅启用,而且强制执行,这堵住了表所有者越过策略读取数据的途径。一项测试从数据库目录读取这两项设置,任何一项处于关闭状态就会失败。

另一项测试列出 schema 中的每张表,只要有表在新增时没有记录它如何受保护的决定,就会失败。

请求能触及什么

对 API 的请求在这些策略之下处理,并携带调用方的工作区、项目和组织,作为数据库读取的声明。每张表上的策略先把这些声明与行进行比较,再考虑其他任何规则。调用方无权看到的行,读起来就像不存在一样。

由应用层决定的部分

数据库无法区分某些操作:对 Postgres 而言,发布一条记录就是一次更新。这些权限在请求到达时检查,依据的是由同一份规范生成的映射,而行规则仍然限定该操作能触及的范围。

了解其工作原理

文档涵盖所有权、可见性、授权,以及针对每种凭证如何解析一个请求。