Firebase安全规则:如何允许文档数组中管理员读写访问?
Firebase Firestore 管理员权限安全规则实现方案
1. 修改现有Users集合规则,同时允许管理员读写
原规则允许所有已认证用户读写,要加入管理员权限,只需添加或条件:先从指定文档中获取管理员列表,判断当前用户ID是否在列表内。假设管理员ID存在/settings/adminSettings文档的admins数组中,修改后的规则如下:
match /users/{uid} { allow read, write: if request.auth != null || exists(/databases/$(database)/documents/settings/adminSettings) && request.auth.uid in get(/databases/$(database)/documents/settings/adminSettings).data.admins; }
这里先判断管理员文档是否存在(避免文档不存在时规则报错),再检查当前用户ID是否在admins数组中,和原有的已认证条件用||连接,满足任一条件即可读写。
2. 封装可复用的isAdmin()函数
完全可以创建全局函数复用管理员校验逻辑,把判断逻辑抽离后,在任意规则中直接调用即可。函数需定义在rules根节点下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 全局管理员校验函数 function isAdmin() { return request.auth != null && exists(/databases/$(database)/documents/settings/adminSettings) && request.auth.uid in get(/databases/$(database)/documents/settings/adminSettings).data.admins; } // 复用函数的Users集合规则 match /users/{uid} { allow read, write: if request.auth != null || isAdmin(); } // 其他集合直接调用函数 match /posts/{postId} { allow read: if true; allow write: if isAdmin(); } } }
后续修改管理员判断逻辑时,只需更新这一个函数,无需逐个修改集合规则,维护效率更高。
3. 全局规则让管理员拥有所有资源读写权限
可以通过通配符匹配所有文档路径实现,只需在根节点下添加一条规则,匹配/{document=**}(表示任意层级的所有文档),允许管理员读写:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function isAdmin() { return request.auth != null && exists(/databases/$(database)/documents/settings/adminSettings) && request.auth.uid in get(/databases/$(database)/documents/settings/adminSettings).data.admins; } // 全局管理员权限:所有资源读写 match /{document=**} { allow read, write: if isAdmin(); } // 原有Users集合规则(Firebase规则优先匹配更具体的路径,因此该规则会优先生效) match /users/{uid} { allow read, write: if request.auth != null; } } }
注意:Firebase安全规则遵循最具体路径优先原则,比如上面的/users/{uid}规则会优先于全局通配符规则生效,已认证用户可读写users集合,而管理员除了users集合,还能读写其他所有资源。
内容的提问来源于stack exchange,提问作者cueless
相关产品推荐
相关产品推荐

