如何配置数据表的行权限
介绍
行级权限控制(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 调用时传递适当的变量值,以保证数据访问的正确性。