![](/img/trans.png)
[英]How to use Firestore Document Reference in Firebase Cloud Storage Security Rules?
[英]Can Firebase Cloud Storage rules validate against Firestore data?
我们可以使用 Firestore 数据来授予或限制对托管在 Firebase 云存储上的文件的访问权限吗?
我想用作 Firebase 安全规则的示例
allow write: if get(/databases/mydbname/documents/guilds/$(guildID)).data.users[(request.auth.uid)] in ["Admin", "Member"];
目前无法从其他产品的安全规则中访问不同的Firebase产品。 请参阅: 有没有办法在firebase存储规则中验证用户角色?
但似乎您正在尝试检查用户的组成员身份。 我建议您将其建模为所谓的自定义声明,而不是在数据库中查找该组成员身份。 除了(或除此之外)将成员资格写入数据库之外,您还可以使用Firebase管理SDK将声明“用户{uid}是组{guild1}的成员”设置到用户配置文件中 :
admin.auth().setCustomUserClaims(uid, {guild1: true}).then(() => {
// The new custom claims will propagate to the user's ID token the
// next time a new one is issued.
});
完成后,您可以检查安全规则中的公会成员资格:
allow read: if request.auth.token.guild1 == true;
(我不确定你是否/如何将公会会员资格建模为地图,如果情况确实如此,我会更新这个答案。)
您可以在使用云 function 触发器上传文件后追溯验证和删除文件。
警告:此技术并非防弹,因为如果 Cloud Function 触发器失败,无效文件将暂时或可能永久存储在 Cloud Storage 中。 我的偏好是首先阻止上传,但如果确定权限的逻辑位于 Firestore 中并且不能填充到自定义声明中,那么如果您使用 Firebase 的客户端 SDK 上传文件,这是目前唯一的方法。 如果您正在构建任务关键型系统,则应将文件上传到 Cloud Function,然后让 Cloud Function 将文件存储在 Cloud Storage 中。
上传文件时,添加一些元数据来指示上传者:
const storageRef = ref(
storage,
`files/${fileName}`,
);
const uploadTask = uploadBytesResumable(storageRef, file, {
customMetadata: {
uploaderId: userId,
},
});
设置存储规则,确保用户身份元数据可信:
match /files/{fileName} {
allow create: if request.auth != null &&
request.resource.metadata.uploaderId == request.auth.uid
}
创建一个可追溯验证和删除的云 function 触发器:
export const onFinalize = functions
.storage.object()
.onFinalize(async object => {
// We can trust object.metadata.uploaderId, so check Firestore if user is able to upload file
if (!(await canUploadFile(object.metadata.uploaderId, object.name))) {
await storage.bucket(object.bucket).file(object.name).delete();
throw new Error(
`Permission error: ${object.metadata.uploaderId} not allowed to upload ${object.name}`,
);
}
// Continue
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.