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

时间:2017-11-08 10:15:52

标签: firebase-realtime-database firebase-authentication admin ionic3 firebase-security

我想要这样的事情:

true

根据我在Firebase控制台中制定的安全规则,这应该返回false或{{1}}。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好的,我完成了建议,在分析了所有内容之后,我找到了一个很好的解决方法。现在让我首先告诉你,我想限制管理员以外的用户查看“添加新项目”,“删除项目”等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;
    });
  }
}

在我的 home.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”是否为真。这样,我们就可以控制哪些UI元素显示给哪种类型的用户..

希望这会有所帮助。谢谢!

答案 2 :(得分:0)

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

例如,我有一个“虚拟”节点,我尝试读取该值。如果操作失败,则表示我正在处理权限问题:

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

            }
        });