存储安全规则结合用户身份验证可以实现身份校验能力,开发者可以根据用户身份信息进行精准的资源访问控制。

# 用户身份认证

经过身份认证的用户发起请求时,系统会使用用户唯一 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"
}