Firestore管理员无法获取全部Transaction数据求助(Vue+Pinia)
解决Admin无法获取所有Transaction数据的问题
1. 修正Firestore安全规则
原规则仅允许用户访问自身创建的交易,需添加admin权限判断逻辑,修改后的规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 用户集合:仅允许自身读写 match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } // 交易集合:普通用户仅访问自身交易,admin可访问全部 match /Transactions/{transactionId} { allow read: if request.auth != null && ( resource.data.userId == request.auth.uid || get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin' ); allow write: if request.auth != null; // 可根据业务需求调整写入权限 } } }
注意:需确保users集合中admin用户的
role字段值为admin,字段名和大小写需完全匹配。
2. 调整前端数据查询逻辑
在获取Transaction的代码(组件或Pinia action)中,根据当前用户角色动态设置查询条件:
Pinia交易数据处理示例(storeTransactions.js)
import { defineStore } from 'pinia' import { db } from '@/firebase/config' import { collection, query, where, getDocs } from 'firebase/firestore' import { useAuthStore } from './storeAuth' export const useTransactionsStore = defineStore('transactions', { state: () => ({ transactions: [] }), actions: { async fetchTransactions() { const authStore = useAuthStore() // 根据角色生成查询条件 const transactionQuery = authStore.userRole === 'admin' ? query(collection(db, 'Transactions')) : query(collection(db, 'Transactions'), where('userId', '==', authStore.user.uid)) const querySnapshot = await getDocs(transactionQuery) this.transactions = querySnapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })) } } })
组件中调用示例
<script setup> import { useTransactionsStore } from '@/stores/storeTransactions' import { useAuthStore } from '@/stores/storeAuth' import { onMounted } from 'vue' const transactionsStore = useTransactionsStore() const authStore = useAuthStore() onMounted(async () => { // 确保用户已认证且角色已加载完成 if (authStore.user) { await transactionsStore.fetchTransactions() } }) </script>
3. 验证storeAuth的角色判断逻辑
检查storeAuth.js中角色获取代码,确保userRole状态正确赋值:
// storeAuth.js片段 async fetchUserProfile() { const userDocRef = doc(db, 'users', this.user.uid) const userDoc = await getDoc(userDocRef) if (userDoc.exists()) { this.userRole = userDoc.data().role // 确认正确读取role字段 } }
关键检查项
- Firestore规则中
get()函数需正确读取当前用户的角色信息,避免权限校验失败 - 前端查询必须严格根据角色区分条件,admin账号查询时不能添加
userId过滤 - 测试时使用admin账号登录,验证是否能加载全部Transaction数据
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

