【发布时间】:2021-05-23 20:48:50
【问题描述】:
我目前正在研究如何使用 firebase,但我无法找到一种方法来仅让用户更新、删除或读取他们添加的图像(集合)。
这是我使用的安全规则:
match /databases/{database}/documents {
match /{document=**} {
function authed(){
return request.auth != null
}
function matchesUser(){
return request.auth.uid == data.userId
}
allow read: if authed() && matchesUser(resource.data)
allow create: if authed() && matchesUser(request.resource.data)
}
}
当我尝试获取数据/读取图像(集合)时,我得到Uncaught Error in snapshot listener: FirebaseError: Missing or insufficient permissions
这是我尝试从 firestore 读取数据的代码
import { useState, useEffect } from 'react'
import {projectFirestore} from '../firebase/firebase'
import {useAuth} from '../contexts/AuthContext'
const useFirestore = (collection) => {
const [docs, setDocs] = useState([])
const {currentUser} = useAuth()
useEffect(() => {
const unsub = projectFirestore.collection(collection)
.orderBy('createdAt', 'desc')
.where("userId", "==", currentUser.uid)
.onSnapshot((snap) => {
let documents = []
snap.forEach(doc => {
documents.push({...doc.data(), id: doc.id})
})
setDocs(documents)
})
return () => unsub()
}, [collection, currentUser])
return {docs}
}
export default useFirestore
这是我尝试让用户将文件上传到 firebase 的代码:
import {useState, useEffect} from 'react';
import {projectStorage, projectFirestore, timestamp} from '../firebase/firebase'
import {useAuth} from '../contexts/AuthContext'
const useStorage = (file) => {
const [progress, setProgress] = useState(0)
const [error, setError] = useState(null)
const [url, setUrl] = useState(null)
const {currentUser} = useAuth()
useEffect(() => {
// references
const storageRef = projectStorage.ref(file.name)
const collectionRef = projectFirestore.collection('images')
storageRef.put(file).on('state_changed', (snap) => {
let percentage = (snap.bytesTransferred / snap.totalBytes) * 100
setProgress(percentage)
}, (err) => {
setError(err)
}, async () => {
const url = await storageRef.getDownloadURL()
const createdAt = timestamp();
collectionRef.add({
url,
userId: currentUser.uid,
createdAt
})
setUrl(url)
})
}, [file])
return { progress, error, url }
}
export default useStorage
【问题讨论】:
-
您的
matchesUser()函数似乎缺少data参数?function matchesUser(data){ return request.auth.uid == data.userId } -
这似乎是一个答案@samthecodingman。 :)
-
非常感谢您的回答,是的,它有效。现在我明白为什么它一开始不起作用了。
-
@FrankvanPuffelen 只有这么多,我才能在公交车上用手机打字而不会晕车。目的是稍后在我的电脑上回到它哈哈。它现在已适当补水作为答案。
-
谢谢山姆!以及能够在公共汽车上打字的荣誉????
标签: reactjs firebase google-cloud-firestore firebase-security