存储安全规则结合用户身份验证可以实现身份校验能力,开发者可以根据用户身份信息进行精准的资源访问控制。
# 用户身份认证
经过身份认证的用户发起请求时,系统会使用用户唯一 id uid
及用户登录方式 loginType
填充 auth
变量。当未经身份验证的用户发出请求时,auth
变量值为 null
。
通过 auth
变量,可以用以下常用方式来根据身份对文件访问进行控制:
- 公开:不判断
auth
值。 - 只对已登录用户公开:检查
auth
不为null
。 - 用户私有:检查
auth.uid
是否等于资源openid
。 - 仅对某种特殊的登录方式进行判断,限制匿名登录用户访问,检查
auth.loginType
不为ANONYMOUS
# 公开
任何不考虑 auth
的规则均可被视为 public
规则,因为他不考虑用户的身份验证上下文,这些规则在呈现公开数据(静态资源内容)的场景下是很适用。
{
"read": "resource.openid != null"
}
# 对登录的用户开放
在某些情况下,你可能希望限制只有登录用户在可以访问用户数据。例如,登录用户才可以查看论坛中的讨论。由于所有未登录用户的 auth
变量为 null
,因此可以设置如下规则:
{
"read": "auth != null"
}
# 用户私有
auth
最常见的使用场景在为个人用户资源提供精细的访问控制,例如上传私人照片等。云存储文件中包含了文件所有者信息(用户唯一 id),在规则中可以如此限制:
{
"read": "auth.uid == resource.openid",
"write": "auth.uid == resource.openid"
}
# 对等不方式进行验证,限制匿名登录用户访问
在应用中可能希望对于不同登录方式的用户展现不同的内容,此时可以对 auth.loginType
进行验证,其值在以下枚举中取:
loginType | description |
---|---|
WECHAT-OPEN | 微信开放平台 |
WECHAT-PUBLIC | 微信公众平台 |
ANONYMOUS | 匿名登录 |
CUSTOM | 自定义登录 |
若希望对匿名登录的用户展示有限的内容,则可通过如下规则限制:
{
"read": "auth.loginType !== 'ANONYMOUS'"
}
# 完整示例
综上,在一个相册应用中,希望所有登录用户都可以上传,浏览广场图片,不允许未登录用户访问,单可以使用匿名登录访问,匿名身份下只可以浏览,不可上传,则可以对存储设置如下规则。
{
"read": "auth != null",
"write": "auth.loginType != 'ANONYMOUS' && auth.openid == resource.openid"
}