如何配置数据表的行权限
介绍
行级权限控制(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}} | 当前用户的 ID | 1001 |
{{department_id}} | 用户所属部门 ID | 5 |
{{region_pattern}} | 区域筛选模式 | 'East%' |
{{start_date}} | 开始日期 | '2024-01-01' |
时间条件过滤
支持基于时间的过滤规则,可使用 NOW()
计算动态时间范围。
示例:
db1.orders.created_at > NOW() - INTERVAL '1 YEAR'
表示用户只能访问过去一年的订单记录。
复杂条件的使用限制
目前 rows_filters
仅支持单条件过滤,不支持 AND
、OR
组合多条件过滤。
示例(不支持):
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 调用时传递适当的变量值,以保证数据访问的正确性。