访问控制
云函数可以从多种入口被调用,云开发提供两套权限控制机制:OPA 鉴权策略(推荐)与 函数级安全规则。本文说明不同访问入口适用的权限控制方式,以及函数级安全规则的配置方法。OPA 的客户端适用范围见 OPA 鉴权策略。
访问入口与权限控制机制
| 访问入口 | 说明 | 权限控制方式 |
|---|---|---|
客户端 SDK 调用(如 callFunction) | Web、小程序等客户端通过 SDK 调用云函数 | OPA 鉴权策略(推荐)、函数级安全规则 |
| HTTP API | 跨语言调用、第三方系统集成,标准 REST API | OPA 鉴权策略 |
| HTTP 网关 | 通过自定义域名、浏览器环境调用 | OPA 鉴权策略 |
| 管理端 API、定时触发器、数据库触发器 | 平台内部调用 | 不经过上述客户端权限控制 |
OPA 鉴权策略(推荐)
OPA 鉴权策略 是环境级的请求鉴权能力,覆盖环境内所有 HTTP API 与 HTTP 网关请求,其中 resource_type 为 functions 的请求即云函数调用。策略可基于用户身份、请求路径、HTTP 方法、环境上下文等条件组合定义访问控制规则,实现比函数级安全规则更精细的权限管控。
函数级安全规则
函数级安全规则 是 CloudBase 云函数的函数级权限控制功能,通过简单的表达式精确控制哪些用户可以调用特定的云函数。
安全规则仅对客户端调用(例如 SDK 的 callFunction 方法)生效,不适用于以下场景:
- 管理端 API 调用
- 定时触发器
- 数据库触发器
配置入口
在 云开发平台/云函数 点击「权限控制」按钮进入配置页面。
基本语法
云函数安全规则配置在环境级别,环境内所有函数共享一个配置文件。配置采用 JSON 格式:
{
"函数名或通配符": {
"invoke": "表达式或布尔值"
}
}
配置结构说明
| 配置项 | 说明 | 示例 |
|---|---|---|
| 顶级 key | 函数名(具体函数)或 *(通配所有函数) | "*"、"getUserInfo" |
| 操作 key | 固定为 invoke,表示调用权限 | "invoke" |
| 规则值 | 布尔值或权限表达式 | 见下方支持的规则值说明 |
- 安全规则顶级配置必须包含 key 为
*的通配配置 - 每个函数配置中必须包含
invoke操作配置 - 规则值支持
true、false、"auth != null"或"auth.loginType != 'ANONYMOUS' && auth != null" - 默认情况下,建议配置为
"auth.loginType != 'ANONYMOUS' && auth != null"(仅登录用户可调用,且匿名用户不可调用)
匹配优先级
- 优先匹配具体的函数名配置
- 如果没有匹配到具体函数名,则使用
*通配配置
支持的规则值
云函数安全规则支持以下规则值:
| 规则值 | 说明 | 适用场景 |
|---|---|---|
true | 允许所有用户调用(包括未登录用户) | 公开接口(获取公告、配置等) |
false | 禁止非管理员访问 | 已废弃的函数、仅内部调用的函数 |
"auth != null" | 仅登录用户可调用 | 需要用户身份验证的业务函数 |
"auth.loginType != 'ANONYMOUS' && auth != null" | 除匿名登录外的其他身份用户可调用 | 不对访客开放的业务函数 |
支持的表达式示例:
- ✅
"auth != null"- 仅登录用户 - ✅
"auth.loginType != 'ANONYMOUS' && auth != null"- 允许除了匿名登录外的其他身份用户调用
不支持的表达式示例:
- ❌
"auth.uid != null"- 不支持单独的属性访问 - ❌
"auth != null && auth.loginType == 'WECHAT'"- 不支持指定特定登录方式 - ❌
"auth.openid != null || auth.uid != null"- 不支持||运算符
如需更精细的权限控制,请在云函数内部实现业务逻辑验证,或使用 OPA 鉴权策略。
常用模板
- 排除匿名登录用户
- 仅登录用户可调用
- 部分公开,部分限制
- 所有函数公开
- 所有函数禁止非管理员调用
{
"*": {
"invoke": "auth.loginType != 'ANONYMOUS' && auth != null"
},
"getPublicData": {
"invoke": true
}
}
- 默认排除匿名登录用户,仅允许显式登录的用户调用
getPublicData允许所有用户调用
{
"*": {
"invoke": "auth != null"
}
}
所有函数默认要求用户登录后才能调用,适用于需要身份验证的业务系统。
{
"*": {
"invoke": "auth != null"
},
"getAnnouncement": {
"invoke": true
},
"adminFunction": {
"invoke": false
}
}
- 默认要求登录
getAnnouncement公开访问adminFunction完全禁止客户端调用
{
"*": {
"invoke": true
}
}
⚠️ 警告:所有函数允许匿名调用,存在安全风险,仅适用于完全公开的接口。
{
"*": {
"invoke": false
}
}
所有函数禁止非管理员调用。
常见问题
可以针对不同用户设置不同权限吗?
安全规则支持以下规则值:true、false、"auth != null" 和 "auth.loginType != 'ANONYMOUS' && auth != null",可以基于登录状态和是否匿名登录进行权限控制。
不支持基于用户角色、用户组、特定用户 ID 等更复杂的权限控制。如需基于用户角色、用户组、请求路径等更精细的权限控制,推荐使用 OPA 鉴权策略,也可在云函数内部进行验证。
如何排查权限错误?
当遇到 PERMISSION_DENIED 错误时,请按以下步骤排查:
- 检查安全规则配置:
- 前往 云开发平台/云函数 查看权限控制配置
- 确认用户登录状态:
- 使用客户端 SDK 检查用户是否已登录
- 对于需要
"auth != null"的函数,确保调用前已完成登录
- 查看错误详情:
- 详细错误信息请参考 PERMISSION_DENIED 错误码