我正在尝试使用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的其他字段。 (在数据库中添加专用表,而不使用已实现的用户身份验证。)
答案 0 :(得分:3)
没有用于Firebase身份验证的“用户角色” API,但是您可以通过多种方法在应用程序中实现基于角色的授权。
如上所述,一种方法是将数据存储在数据库中。这样做的好处是易于实现。
您可以通过在Firestore和Realtime数据库的数据库规则中进行查找来实施规则。
{
"rules": {
"adminContent": {
".write": "root.child('users').child(auth.uid).child('admin').val() === true"
}
}
}
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。
{
"rules": {
"adminContent": {
".read": "auth.token.admin === true",
".write": "auth.token.admin === true",
}
}
}
Firestore和Storage规则的规则语法相似,并且您发现allow
语句对于两者是相同的。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.token.admin == true;
}
}
}