为什么需要RLS
SupaBase的接口使用比较灵活,可以在客户端直接调用,也可以在服务端调用。开发过web应用的同学在处理数据访问权限时应该比较熟悉一些基本的套路,甚至这些套路已经固化到了开发习惯中。我们以一个典型场景来说明一下传统Web开发过程中,数据鉴权的流程:
通常我们都会按照上面的思路来编写后端代码,校验用户是否有权限访问数据库中的某一条数据。同样的,在查询数据时,我们通常也是在后端程序中通过过滤条件来查询数据,以确保返回的数据是当前用户有权限访问的。
SupaBase提供了灵活的数据库访问接口,让开发者可以在前端代码中直接访问数据库中的数据,那么开发者能采用相同的模式在前端通过代码来实现类似的数据权限访问控制吗?
答案是:不能。
原因很直观。代码运行在客户端和服务端的差异非常明显,服务端代码是受保护的,用户无法篡改服务端程序的代码,因此在服务端代码中进行数据权限访问控制是可靠的。但是客户端不同,用户如果有一定的编码能力,可以随意改动客户端代码,尤其是像JavaScript这种脚本语言,代码都是明文的,更加方便修改。所以在客户端编写权限访问控制的代码逻辑是不合适的。所有的权限控制必须在服务端实现。
SupaBase解决这个问题的方案就是利用Postgrest RLS策略来实现数据访问控制,对于不熟悉Postgrest数据库的开发者,在阅读本篇内容之前,建议先阅读