You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用配置Firebase Realtime Database规则后读取数据权限被拒绝

异常原因

Firebase 实时数据库的权限规则遵循 规则不是过滤器 的核心原则:权限校验会在你发起读取请求的节点层级直接完成,不会等到客户端再过滤子节点时才做校验。

你当前的代码直接调用database.reference.addListenerForSingleValueEvent(),也就是直接请求数据库的根节点数据,但你最初配置的规则里,根节点没有开放.read权限,仅给settings/prod和settings/test两个子节点单独开放了读权限,所以请求根节点时权限校验直接不通过,就触发了Permission Denied异常。

你修改规则为全局可读后,根节点开放了读权限,请求自然就可以正常执行。

修复方案

不要直接读取根节点,直接请求你需要的目标子节点即可,修改后的代码参考如下:

val buildType = if (BuildConfig.IS_PROD) "prod" else "test"
val database = FirebaseDatabase.getInstance()        
// 直接指向对应环境的settings节点,不需要读取全量根节点数据
val targetRef = database.getReference("settings").child(buildType)
targetRef.addListenerForSingleValueEvent(
    object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            if (snapshot.exists()) {
                val settingsDTO = snapshot.getValue(FirebaseSettings::class.java)!!
                tasks.setResult(settingsDTO)
                Timber.d("Database 1 $settingsDTO")
                targetRef.removeEventListener(this)
            }
        }

        override fun onCancelled(error: DatabaseError) {
            Timber.d("Database $error")
            tasks.setException(Exception(error.message))
        }
    })

修改后你请求的就是已经开放了读权限的settings/prod或settings/test节点,就能正常通过权限校验。

内容的提问来源于stack exchange,提问作者Sergei Mikhailovskii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:30:02