因此,我正在为我的项目设置 Firebase 安全规则,并且为了使用户能够读取房间,我们需要确保他们是该组织的一部分。所以我有一个这样的安全规则:
root.child('organizations').child(data.child('organization_id').val()).child('user_ids').hasChild(auth.uid)
这不仅非常丑陋,同一语句中还有其他几个规则(用 &&/|| 分隔),这些规则以
root.child('organizations').child(data.child('organization_id').val())
开头,用于访问与该房间关联的组织变量中的数据。
这会导致一些丑陋的安全规则,有什么方法可以制作临时变量或类似的东西,这样我就可以使其更具可读性?谢谢!
这个问题(以及我在下面的回答)是关于 Firebase 实时数据库及其安全规则。
如果您正在寻找在 Cloud Firestore 或 Cloud Storage 安全规则中使用本地变量,现在是可以实现的。请查看博客文章Firestore 安全规则的新改进和有关本地变量的发行说明。
最好的解决方案是用更高级的语言编写规则,然后编译成 Firebase 安全规则。最著名的是
Blaze(它们的鼻祖)、Butane(不是来自 Firebase 本身)和 Bolt(新的且正在非常活跃的开发中)。
Bolt 例如允许您定义(全局)是的,您可以拥有局部变量(如果对其他人有帮助,请回答)
来自上面链接的 firebase 博客
局部变量一直是规则中最受欢迎的功能之一,现在它们可以在函数中使用。
type Room {
organization_id: String,
read() { isUserInOrg(this.organization_id) }
}
isUserInOrg(org_id) { root.organizations[org_id].user_ids[auth.uid] }
设置
your-project-root/
│
├── watch-and-generate-rules.js
├── database.rules.template.json
├── database.rules.variables.json
├── database.rules.json (generated & should already exist)
│
└── .vscode/
├── tasks.json
└── settings.json
npm install chokidar
watch-and-generate-rules.js
:
const fs = require('fs');
const path = require('path');
const chokidar = require('chokidar');
const templatePath = path.join(__dirname, 'database.rules.template.json');
const variablesPath = path.join(__dirname, 'database.rules.variables.json');
const outputPath = path.join(__dirname, 'database.rules.json');
function generateRules() {
const template = fs.readFileSync(templatePath, 'utf8');
const variables = JSON.parse(fs.readFileSync(variablesPath, 'utf8'));
let rulesContent = template;
for (const [key, value] of Object.entries(variables)) {
const regex = new RegExp(`\\$\\{${key}\\}`, 'g');
rulesContent = rulesContent.replace(regex, value);
}
fs.writeFileSync(outputPath, rulesContent);
console.log('Firebase rules generated successfully!');
}
generateRules();
const watcher = chokidar.watch([templatePath, variablesPath]);
watcher.on('change', (path) => {
console.log(`File changed: ${path}. Regenerating rules...`);
generateRules();
});
console.log(`Watching for changes. Press Ctrl+C to stop.`);
.vscode/tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"command": "node watch-and-generate-rules.js",
"isBackground": true,
"problemMatcher": [
{
"pattern": [
{
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
}
],
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
}
],
"group": "build",
"label": "Watch and Generate Firebase Rules",
"runOptions": {
"runOn": "folderOpen"
}
}
]
}
.vscode/settings.json
:
{
"task.allowAutomaticTasks": "on"
}
database.rules.template.json
:
{
"rules": {
"users": {
"$userId": {
".read": "${READ_ACCESS}",
".write": "${WRITE_ACCESS}"
}
}
}
}
database.rules.variables.json
:
{
"READ_ACCESS": "auth != null",
"WRITE_ACCESS": "auth != null && auth.uid == $userId"
}
6b。 ...或者您可以直接重构现有的规则文件。只需查看 git 中原始规则文件的状态即可。只要你正确地重构,就不会改变任何事情。将来当你想更改某些内容时,只需编辑模板和变量 json 即可。