Firebase realtime database 在Firebase中,如何检查用户是否具有对数据库的写访问权限?或者如何限制用户访问数据库?

Firebase realtime database 在Firebase中,如何检查用户是否具有对数据库的写访问权限?或者如何限制用户访问数据库?,firebase-realtime-database,firebase-authentication,admin,ionic3,firebase-security,Firebase Realtime Database,Firebase Authentication,Admin,Ionic3,Firebase Security,我想要这样的东西: firebase.auth().currentUser.canWrite(); 根据我在Firebase Console中制定的安全规则,应该返回true或false。首先,您需要使用限制对实时数据库的访问(因为默认情况下,您限制或允许所有用户的读/写权限) 然后,在客户机上,通过解析id令牌并检查自定义声明,检查给定用户是否有权访问db(请参阅上面链接中“在客户机上访问自定义声明”一节中的示例。示例是用JS编写的,但将其转换为例如Swift应该没有问题)。此外,您可以轻松

我想要这样的东西:

firebase.auth().currentUser.canWrite();

根据我在Firebase Console中制定的安全规则,应该返回
true
false

首先,您需要使用限制对实时数据库的访问(因为默认情况下,您限制或允许所有用户的读/写权限)


然后,在客户机上,通过解析id令牌并检查自定义声明,检查给定用户是否有权访问db(请参阅上面链接中“在客户机上访问自定义声明”一节中的示例。示例是用JS编写的,但将其转换为例如Swift应该没有问题)。此外,您可以轻松地将此功能(检查有效声明)封装在您自己的
canWrite()
扩展中,该扩展位于
FIRUser
对象上,该对象根据令牌是否具有正确声明返回true或false。

好的,我仔细阅读了建议,在分析了所有内容后,我找到了一个很好的解决方法。现在让我首先告诉您,我想限制管理员以外的用户查看诸如“添加新项目”、“删除项目”等UI按钮,以便他们无法修改数据库

例如,我只需要具有凭据的用户admin@admin.com访问允许在数据库中修改的按钮和页面

这是一个爱奥尼亚项目

在我的app.component.ts文件中:

import { Events } from 'ionic-angular';

export class MyApp{

  admins: any;

  constructor(public events: Events){

    this.initializeApp();

    this.admins =[
      {email: 'admin@admin.com'},
      {email: 'another_admin@admin.com'}
    //You may add more users whom you want to give admin privilege..
    ];

   // Now subscribe to an event to check if the logged-in user is an admin user or not!

    events.subscribe('check:admin', (email) => {
      var isAdmin = false;
      this.admins.forEach((x) => {
        if(email === x.email)
          isAdmin = true;
      });
     return isAdmin;
    });
  }
}
在myhome.ts文件中:这可以是项目中的任何页面,不一定是主页

import { Events } from 'ionic-angular';

export class HomePage{

  // Now declare and initialize a boolean variable. This will be true if the logged-in (currentUser) user is an admin.

    isAdmin = this.events.publish('check:admin', firebase.auth().currentUser.email)[0];
 // this.events.publish() returns an array, hence the weird workaround of '[0]'.

  constructor(private events: Events){}

}
现在在我的home.html页面:

<button *ngIf="isAdmin">Add new Item</button>
添加新项目
此处,“添加新项目”按钮仅在变量“isAdmin”为true时显示。通过这种方式,我们可以控制向哪种类型的用户显示哪些UI元素


希望这有帮助。谢谢

检查用户是否有权访问数据库的一种可能方法是尝试从数据库中读取(或写入)任何值

例如,我有一个“虚拟”节点,我尝试读取该值。如果操作不成功,这意味着我正在处理权限问题:

dummyNode.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // read access successfully tested.

            }

            @Override
            public void onCancelled(DatabaseError firebaseError) {

                Log.v(TAG,"firebaseError:"+firebaseError);

                //Common Error here: Transaction at /F failed: DatabaseError: Permission denied

            }
        });

酷。我看了一眼,终于找到了一个适合我目的的解决办法。我已经把它作为一个答案[链接](.谢谢!