Vue.js+Firebase项目用户角色分配与文档权限控制实现方案咨询
Vue.js + Firebase 角色权限与字段级控制实现方案
1. 角色分配与文档初始化
- 三个注册表单分别携带唯一合法来源标识,所有角色分配逻辑全部放在Firebase Cloud Function中处理,禁止前端直接指定角色,避免参数篡改。
- 部署
functions.auth.user().onCreate触发器,用户通过Firebase Authentication创建完成后,校验来源标识的合法性,给用户分配对应角色的自定义声明(customClaims,例如{ role: "merchant" }),同时按照需求初始化Firestore文档结构:- 根目录创建
users集合,每个用户对应users/{$uid}文档节点 - 节点下创建
access子文档,存储角色、可编辑字段范围、可读权限等元数据 - 节点下创建
private子集合,用于存放后续用户相关的私有文档
- 根目录创建
2. 核心权限控制(Firestore安全规则配置)
字段级修改限制完全通过Firebase安全规则实现,这是权限控制的核心屏障,前端的权限校验仅做体验优化用,不能替代后端规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 匹配所有用户个人节点 match /users/{uid}/{document=**} { // 仅文档所属用户可读 allow read: if request.auth != null && request.auth.uid == uid; // access文档写入规则 match /access { // 仅允许修改指定字段,例如仅放开昵称、头像、联系方式的编辑权限,不允许修改角色、创建时间等核心字段 allow update: if request.auth.uid == uid && request.resource.data.keys().difference(["nickname", "avatar", "contact"]).size() == 0; // 禁止普通用户创建、删除access文档,仅管理员/云函数可操作 allow create, delete: if request.auth != null && request.auth.token.role == "admin"; } // private集合写入规则 match /private/{privateDoc} { // 按需限制可编辑字段,这里示例仅允许修改内容、更新时间字段 allow update: if request.auth.uid == uid && request.resource.data.keys().difference(["content", "updateTime"]).size() == 0; // 普通用户可自行创建、删除private下的子文档,可按需调整权限 allow create, delete: if request.auth.uid == uid; } } // 按需配置管理员全局权限 match /{document=**} { allow read, write: if request.auth != null && request.auth.token.role == "admin"; } } }
3. 前端适配逻辑
- Vue端获取当前用户的自定义声明,隐藏无权限的操作入口,优化使用体验
- 提交修改请求时仅传递需要更新的字段,不要整份文档覆盖提交,避免触发规则拦截
注意事项
- 自定义声明最大存储空间为1000字节,仅存储角色、权限标识这类核心信息即可
- 后续如果需要调整用户可编辑字段范围,仅修改安全规则即可,无需调整前端业务代码
- 所有角色分配、文档初始化操作全部放在云函数执行,不要给前端开放
users集合的初始化权限,避免数据被篡改
内容的提问来源于stack exchange,提问作者Filippo Amenta
相关产品推荐
相关产品推荐

