安全规则
简介
安全规则是在基础权限控制之上的一种更高级、更灵活、更可扩展的权限控制方式,专为保护用户云端数据安全而设计。
为什么需要安全规则?
基础权限控制是根据开发过程中常见场景预置的权限组,能够实现简单的权限管控。然而,随着应用业务场景日益复杂,这种管控方式已无法满足根据用户角色或登录模式等条件进行精细化管控的需求。
在传统的基础权限控制模式下,要实现复杂的权限管理,开发者需要:
- 将所有客户端操作集中到云函数中
- 在云函数内部编写校验判断逻辑
- 通过这种方式间接实现访问控制
而使用安全规则,开发者可以:
- 自定义精确的管控条件
- 通过简洁的规则语句完成权限配置
- 让系统根据规则自动完成访问控制
- 实现数据校验等更高级功能
安全规则基于 JSON 格式的可扩展配置语言,清晰定义用户可访问的数据库与存储资源范围。开发者可根据应用需求的细化程度,编写简单或复杂的规则来全面保护应用数据。
核心优势
高度灵活性 - 开发者可根据业务特性自定义规则,支持基于应用数据本身的动态访问控制,实现条件化的数据访问策略。
精细化粒度 - 规则可以精确到字段级别,根据需求设置简单或复杂的访问条件,满足不同场景的安全需求。
安全性与独立性 - 规则在管理端独立配置,完全分离于应用业务逻辑:
- 客户端无法获取规则内容
- 无法绕过规则验证
- 确保所有数据访问都经过严格校验
开发便捷性 - 通过配置式规则即可完成权限控制:
- 无需开发额外的接入层管控代码
- 免去复杂的部署流程
- 支持快速验证和调整
工作原理
安全规则的工作流程如下:
- 规则读取 - 当用户尝试访问数据时,系统首先读取管理端设置的完整规则配置(JSON格式)
- 操作匹配 - 系统根据请求的操作类型(如
read
、write
等)匹配对应的规则配置 - 规则解析 - 配置值可能是:
- 简单的布尔值(
true
/false
) - 类JavaScript语法的逻辑表达式字符串
- 简单的布尔值(
- 权限判定 - 当布尔值为
true
或表达式计算结果为true
时,允许访问;否则拒绝访问 - 操作执行 - 只有在允许访问的情况下,系统才会执行后续的数据操作
基础规则配置示例
{
// 读取权限:设为false表示禁止读取
"read": false,
// 写入权限:使用条件表达式动态判断
"write": <<condition>>
}
表达式中可使用内置变量获取请求的身份信息和元数据,实现复杂的逻辑判断。要深入了解规则语法和可用变量,请参阅规则语言详解。
计费说明
安全规则功能本身完全免费,不收取任何额外费用。但需要注意:
- 规则中使用元数据变量(如
doc
、resource
)或获取函数(如get
)时,会对相应资源产生读取操作 - 这些读取操作将消耗相应资源的用量配额
- 计费方式遵循各资源自身的计费规则
使用限制
表达式限制
- 每个表达式(组)最大长度限制为1024字符
支持的语法元素
- 变量:支持各类变量引用(不支持正则表达式)
- 数组表达式:数组成员限制为数字或字符串类型
- 逻辑表达式:支持
&&
(与)、||
(或)等逻辑运算符 - 一元表达式:支持
+1
、-1
、!a
等一元运算 - 二元表达式:支持
>
、>=
、<
、<=
、==
、!=
、in
等比较运算符 - 成员表达式:支持
a.b
、a["b"]
等成员访问方式 - 调用表达式:仅数据库安全规则支持函数调用
- 字符串模板表达式:用于数据库函数调用的动态参数,例如:`database.collection.\${doc.objectId}`