Python对接Firebase实时数据库如何配置规则实现用户仅访问自身数据
问题根源分析
- 原规则存在语法错误:规则字符串拼接时引号不匹配,会直接导致规则校验失败无法生效
- 原规则适配的
users节点不存在:你的实际数据库根节点为kayitlar和musderi,原规则完全没有覆盖这两个业务节点,等于之前的规则根本没生效,才会出现用户能拉全量数据的问题 - 身份标识不匹配:你的数据中用编码后的邮箱作为用户唯一标识,而原规则是用Firebase Auth返回的
auth.uid做匹配,二者对应不上,权限校验自然失败 - 注册逻辑无对应权限:新用户注册时需要在
musderi节点写入自己的账号信息,原规则没有开放对应的写入权限,导致注册失败 - 数据请求路径不合理:你现在直接请求数据库根路径拉全量数据,就算规则配置正确,根路径没有读权限也会请求失败,后续需要调整为拉取当前用户对应的子节点
调整方案
1. 修改Firebase Realtime Database安全规则
替换原有规则为以下内容即可同时满足权限控制和注册需求:
{ "rules": { "musderi": { "$user_email_encode": { ".read": "auth != null && $user_email_encode == auth.token.email.replace('.', '-')", ".write": "auth != null && $user_email_encode == auth.token.email.replace('.', '-')" } }, "kayitlar": { "$record_id": { "$user_email_encode": { ".read": "auth != null && $user_email_encode == auth.token.email.replace('.', '-')", ".write": "auth != null && $user_email_encode == auth.token.email.replace('.', '-')" } } }, ".read": false, ".write": false } }
规则逻辑说明:
- 全局根路径默认禁止所有读写,避免越权访问未配置的节点
musderi节点下的每个子节点都是编码后的邮箱,仅对应邮箱的登录用户可以读写自己的账号信息,新用户注册时只要先完成Firebase Auth账号创建、拿到有效token后,用自己的邮箱编码作为节点名写入即可,不会被拦截kayitlar节点下的每条记录仅对应用户可以读写,其他用户无法访问
2. 调整数据请求逻辑
原有拉取全量根路径的逻辑需要修改为拉取当前用户对应的子节点,示例调整后的代码:
# 从Firebase Auth登录结果中获取当前登录用户的邮箱 current_user_email = "当前登录用户的邮箱" email_encode = current_user_email.replace('.', '-') # 请求自己的账号信息 user_info_req = requests.get(f"{self.url}/musderi/{email_encode}?auth={self.auth}") user_info = user_info_req.json() # 请求自己的业务记录 kayitlar_req = requests.get(f"{self.url}/kayitlar?auth={self.auth}") all_kayitlar = kayitlar_req.json() user_kayitlar = [item for item in all_kayitlar.values() if email_encode in item]
注意:不要在数据库中存储明文密码,Firebase Auth已经托管了密码的加密存储,自行存储明文密码存在严重数据泄露风险。
内容的提问来源于stack exchange,提问作者la by
相关产品推荐
相关产品推荐

