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
相关产品推荐
相关产品推荐

