用户角色的用户身份验证中有任何功能吗?

时间:2019-01-03 10:46:21

标签: html firebase firebase-authentication

我正在尝试使用Firebase为我的Web应用程序创建登录界面。我想使用Firebase自己的身份验证系统向自己的帐户添加user role。 (电子邮件)。但是它不支持添加user role的任何选项。例如“管理员”和“用户”。

这是用于Firebase(当前为5.7.2)和HTML5。

login.js(当前登录身份验证)

(function(){
var ui = new firebaseui.auth.AuthUI(firebase.auth());

var uiConfig = {
    callbacks: {
      signInSuccessWithAuthResult: function(authResult, redirectUrl) {
        // User successfully signed in.
        // Return type determines whether we continue the redirect automatically
        // or whether we leave that to developer to handle.
        return true;
      },
      uiShown: function() {
        // The widget is rendered.
        // Hide the loader.
        document.getElementById('loader').style.display = 'none';
      }
    },
    // Will use popup for IDP Providers sign-in flow instead of the default, redirect.
    signInFlow: 'popup',
    signInSuccessUrl: 'index.html',
    signInOptions: [
      // Leave the lines as is for the providers you want to offer your users.
      firebase.auth.EmailAuthProvider.PROVIDER_ID,
    ],
  };

  ui.start('#firebaseui-auth-container', uiConfig);
})()

我希望在js中的某个位置添加选项或用户角色字段作为电子邮件的唯一标识符? (adminabc@xx.com =管理员,userabc @ xx.com =用户)或firebase的其他字段。 (在数据库中添加专用表,而不使用已实现的用户身份验证。)

1 个答案:

答案 0 :(得分:3)

没有用于Firebase身份验证的“用户角色” API,但是您可以通过多种方法在应用程序中实现基于角色的授权。

数据库

如上所述,一种方法是将数据存储在数据库中。这样做的好处是易于实现。

您可以通过在Firestore和Realtime数据库的数据库规则中进行查找来实施规则。

Realtime database

{
  "rules": {
    "adminContent": {
      ".write": "root.child('users').child(auth.uid).child('admin').val() === true"
    }
  }
}

Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /articles/{article} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
    }
  }
}

在数据库中维护您的角色和凭据的弊端是您不能跨产品使用该信息。您不能编写访问RTDB规则的Firestore数据库规则,反之亦然。

自定义声明

如果您希望您的角色跨服务工作(在RTDB,Firestore和Firebase Storage中使用相同的角色数据),那么您应该研究设置自定义声明,这很好地解释了in the documentation

设置完成后,您可以使用自定义声明在不同产品中实现基于角色或group access rights

database.rules.json

{
  "rules": {
    "adminContent": {
      ".read": "auth.token.admin === true",
      ".write": "auth.token.admin === true",
    }
  }
}

firestore.rules / storage.rules

Firestore和Storage规则的规则语法相似,并且您发现allow语句对于两者是相同的。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.token.admin == true;
    }
  }
}