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

5
我希望能得到这样的东西:
firebase.auth().currentUser.canWrite();

根据我在Firebase控制台中设置的安全规则,这应该返回truefalse

3个回答

2
首先,您需要使用自定义声明和安全规则来限制实时数据库的访问(因为默认情况下,您会限制或允许所有用户的读/写权限)。
然后,在客户端上,通过解析id令牌并检查自定义声明(请参考上面链接中“在客户端上访问自定义声明”一节中的示例。该示例是用JS编写的,但转换为Swift等语言也应该没问题),检查给定用户是否有权访问db。此外,您可以轻松地将此功能(检查有效声明)包装在自己的FIRUser对象的canWrite()扩展中,该扩展返回true或false,具体取决于令牌是否具有正确的声明。

很好。我看了一下,找到了一个适合我的目的的解决方法。我已经在这里发布了答案[链接](https://dev59.com/yKbja4cB1Zd3GeqPipeX#47210909)。谢谢! - Pramod Kumavat

0

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

举个例子,我只希望具有admin@admin.com凭据的用户可以访问允许在数据库中进行修改的按钮和页面。

附:这是一个Ionic项目。

在我的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元素。

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


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

            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接