
sidebar.wechat

sidebar.feishu
sidebar.chooseYourWayToJoin

sidebar.scanToAddConsultant
在企业级数据分析场景中,数据安全是头等大事。不同角色的用户应该只能访问自己权限范围内的数据。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 改写
最佳实践: ✅ 遵循最小权限原则 ✅ 使用动态变量实现灵活控制 ✅ 定期审查和测试权限配置 ✅ 文档化权限设计
下一步:
相关阅读:
技术交流:
sidebar.noProgrammingNeeded
sidebar.startFreeTrial