跳到主要内容

如何配置数据表的行权限

介绍

行级权限控制(Row-Level Security,RLS)是数据访问控制的重要机制之一,AskTable 允许用户基于特定条件访问数据库表中的部分数据。通过定义行过滤规则,可以确保用户只能访问符合条件的数据。

在 AskTable 中,行权限规则通过策略中的 rows_filters 配置来定义。本文将介绍如何编写行过滤规则表达式,以便正确配置数据表的行权限。

行过滤规则的基本格式

行过滤规则遵循以下格式:

<schema_name>.<table_name>.<field_name> <expression>
  • schema_name:数据库 Schema(DB),可使用 * 进行通配。Excel/CSV 使用文件名作为 schema_name
  • table_name:数据库表名,可使用 * 进行通配。Excel 使用 Sheet 名作为 table_name
  • field_name:用于筛选行的字段名。
  • expression:条件表达式,定义用户访问数据的约束。

示例:

db1.users.user_id = {{user_id}}

表示用户只能访问 db1.users 表中 user_id 等于其自身 ID 的行。

支持的操作符

行过滤表达式支持以下操作符:

  • 比较运算符:=, >, <, >=, <=, <>, !=
  • 集合运算符:IN, NOT IN
  • 模糊匹配:LIKE, NOT LIKE
  • 逻辑运算符:IS NULL, IS NOT NULL

示例:

db1.orders.customer_id = {{customer_id}}
db1.employees.department_id IN {{allowed_departments}}
db1.sales.region LIKE {{region_pattern}}

使用变量

变量需要用 {{ }} 包裹,并且在调用 API 时传递相应的值。

示例:

db1.employees.manager_id = {{manager_id}}

如果 manager_id 变量的值为 123,则 SQL 解析为:

SELECT * FROM db1.employees WHERE manager_id = 123;

变量示例

变量说明示例值
{{user_id}}当前用户的 ID1001
{{department_id}}用户所属部门 ID5
{{region_pattern}}区域筛选模式'East%'
{{start_date}}开始日期'2024-01-01'

时间条件过滤

支持基于时间的过滤规则,可使用 NOW() 计算动态时间范围。

示例:

db1.orders.created_at > NOW() - INTERVAL '1 YEAR'

表示用户只能访问过去一年的订单记录。

复杂条件的使用限制

目前 rows_filters 仅支持单条件过滤,不支持 ANDOR 组合多条件过滤。

示例(不支持):

db1.orders.customer_id = {{customer_id}} AND db1.orders.status = 'active'

需要拆分为两条规则(须同时满足):

db1.orders.customer_id = {{customer_id}}

db1.orders.status = 'active'

典型用例

1. 用户只能查看自己的数据

db1.users.user_id = {{user_id}}

2. 经理只能查看自己部门的员工

db1.employees.department_id = {{department_id}}

3. 仅查看最近一年的订单

db1.orders.created_at > NOW() - INTERVAL '1 YEAR'

4. 仅访问特定城市的客户

db1.customers.city_id = {{city_id}}

结论

通过 rows_filters 配置行权限,可以实现灵活的数据访问控制。请确保根据业务需求正确编写规则,并在 API 调用时传递适当的变量值,以保证数据访问的正确性。