
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
在企业级数据分析场景中,数据安全是头等大事。不同角色的用户应该只能访问自己权限范围内的数据。AskTable 提供了一套完整的权限控制体系,支持库/表/字段/行四级权限控制。
本文将全面讲解 AskTable 的权限控制机制,帮助你构建安全可靠的数据分析系统。
场景 1:多租户数据隔离
场景 2:分公司数据权限
场景 3:敏感字段保护
场景 4:环境隔离
应用层控制:
数据库视图:
AskTable 的解决方案:
加载图表中...
AskTable 支持在每个层级进行权限控制:
访问策略定义了某个人能访问(或不能访问)的数据集。
核心属性:
permission:访问权限(allow 或 deny)name:策略名称dataset_config:数据集配置策略类型:
角色是访问策略的集合,用户通过扮演角色来访问数据。
角色特点:
{{user_id}})控制能访问哪些数据源:
{ "permission": "allow", "name": "production_only", "dataset_config": { "datasource_ids": "ds_prod_001" } }
效果:
使用正则表达式匹配:
{ "permission": "allow", "name": "public_tables_only", "dataset_config": { "datasource_ids": "*", "regex_patterns": { "schemas_regex_pattern": "^public$", "tables_regex_pattern": "^(users|orders|products)$" } } }
效果:
隐藏敏感字段:
{ "permission": "deny", "name": "hide_sensitive_fields", "dataset_config": { "datasource_ids": "*", "regex_patterns": { "fields_regex_pattern": ".*password.*|.*pwd.*|.*phone.*|.*id_card.*" } } }
效果:
过滤数据行:
{ "permission": "allow", "name": "regional_data", "dataset_config": { "datasource_ids": "ds_001", "rows_filters": { "ds_001": [ "public.orders.region = {{region}}", "public.users.status = 'active'" ] } } }
效果:
动态变量允许在查询时传递参数,实现更灵活的权限控制。
语法:
{{variable_name}}
支持的变量类型:
{{user_id}}{{region}}{{department_id}}定义策略:
{ "permission": "allow", "name": "user_own_data", "dataset_config": { "datasource_ids": "ds_001", "rows_filters": { "ds_001": [ "public.orders.user_id = {{user_id}}", "public.*.created_by = {{user_id}}" ] } } }
查询时传递变量:
from asktable import Asktable client = Asktable(api_key="your_api_key") # 查询时传递 user_id response = client.answers.create( datasource_id="ds_001", question="查询我的订单", role_id="role_employee", role_variables={"user_id": "12345"} )
实际执行的 SQL:
SELECT * FROM orders WHERE user_id = '12345' -- 自动注入
支持的操作符:
=!=, <>>, <, >=, <=IN (value1, value2)LIKE 'pattern'IS NULL, IS NOT NULL支持的函数:
NOW():当前时间NOW() - 1 YEAR, NOW() - 30 DAY示例:
{ "rows_filters": { "ds_001": [ "public.orders.created_at > NOW() - 30 DAY", "public.orders.amount >= 1000", "public.orders.status IN ('paid', 'shipped')" ] } }
场景:SaaS 平台,每个租户只能看自己的数据
步骤 1:创建访问策略
{ "permission": "allow", "name": "tenant_isolation", "dataset_config": { "datasource_ids": "ds_saas", "rows_filters": { "ds_saas": [ "*.*.tenant_id = {{tenant_id}}" ] } } }
步骤 2:创建角色
{ "name": "tenant_user", "policies": ["tenant_isolation"] }
步骤 3:查询时传递租户 ID
response = client.answers.create( datasource_id="ds_saas", question="查询用户总数", role_id="role_tenant_user", role_variables={"tenant_id": "tenant_abc"} )
效果:
场景:集团公司,分公司只能看自己区域的数据
步骤 1:创建区域策略
{ "permission": "allow", "name": "regional_access", "dataset_config": { "datasource_ids": "ds_erp", "rows_filters": { "ds_erp": [ "public.orders.region = {{region}}", "public.customers.region = {{region}}", "public.employees.region = {{region}}" ] } } }
步骤 2:创建角色
{ "name": "regional_manager", "policies": ["regional_access"] }
步骤 3:不同区域的查询
# 上海分公司 response = client.answers.create( datasource_id="ds_erp", question="查询本月销售额", role_id="role_regional_manager", role_variables={"region": "上海"} ) # 北京分公司 response = client.answers.create( datasource_id="ds_erp", question="查询本月销售额", role_id="role_regional_manager", role_variables={"region": "北京"} )
场景:普通员工不能查看手机号、身份证等敏感信息
步骤 1:创建敏感字段拒绝策略
{ "permission": "deny", "name": "hide_pii", "dataset_config": { "datasource_ids": "*", "regex_patterns": { "fields_regex_pattern": ".*phone.*|.*mobile.*|.*id_card.*|.*ssn.*|.*credit_card.*" } } }
步骤 2:创建普通员工角色
{ "name": "employee", "policies": ["hide_pii"] }
步骤 3:创建管理员角色(无限制)
{ "name": "admin", "policies": [] // 无限制 }
效果:
场景:员工只能查询最近 90 天的数据
步骤 1:创建时间限制策略
{ "permission": "allow", "name": "recent_data_only", "dataset_config": { "datasource_ids": "ds_001", "rows_filters": { "ds_001": [ "*.*.created_at > NOW() - 90 DAY" ] } } }
效果:
只授予必要的权限:
示例:
// 不好的做法:授予所有权限 { "permission": "allow", "dataset_config": { "datasource_ids": "*" } } // 好的做法:明确指定 { "permission": "allow", "dataset_config": { "datasource_ids": "ds_001", "regex_patterns": { "tables_regex_pattern": "^(users|orders)$" } } }
建议的权限层次:
灵活匹配表名和字段名:
{ "regex_patterns": { // 匹配所有以 user_ 开头的表 "tables_regex_pattern": "^user_.*$", // 匹配所有包含 temp 或 test 的表 "tables_regex_pattern": ".*(temp|test).*", // 匹配所有敏感字段 "fields_regex_pattern": ".*(password|pwd|secret|token|key).*" } }
建议的命名规范:
示例:
✅ user_id ✅ department_id ✅ region_code ✅ start_date ❌ uid ❌ did ❌ r ❌ sd
测试清单:
方法 1:使用 MCP 测试
from asktable import Asktable client = Asktable(api_key="your_api_key") # 测试查询 response = client.sqls.create( datasource_id="ds_001", question="查询所有用户", role_id="role_employee", role_variables={"user_id": "12345"} ) # 查看生成的 SQL print(response.query.sql) # 应该包含:WHERE user_id = '12345'
方法 2:直接查看 SQL
在 AskTable 界面中:
问题 1:权限没有生效
检查:
问题 2:动态变量没有替换
检查:
问题 3:权限过于严格
检查:
一个角色可以包含多个策略:
{ "name": "sales_manager", "policies": [ "regional_access", // 区域限制 "hide_pii", // 隐藏敏感信息 "recent_data_only" // 时间限制 ] }
策略优先级:
数据源通配符:
{ "datasource_ids": "*" // 所有数据源 }
表名通配符:
{ "rows_filters": { "ds_001": [ "*.*.user_id = {{user_id}}" // 所有表的 user_id 字段 ] } }
多个条件组合:
{ "rows_filters": { "ds_001": [ "public.orders.user_id = {{user_id}}", "public.orders.status IN ('paid', 'shipped')", "public.orders.created_at > NOW() - 30 DAY" ] } }
注意:
AskTable 的权限控制体系提供了:
核心能力: ✅ 四级权限控制(数据源/Schema/表/字段/行) ✅ 动态权限变量 ✅ 灵活的策略组合 ✅ 自动 SQL 改写
最佳实践: ✅ 遵循最小权限原则 ✅ 使用动态变量实现灵活控制 ✅ 定期审查和测试权限配置 ✅ 文档化权限设计
下一步:
相关阅读:
技术交流: