如何在 polymerfire 中检查登录的管理员?
How to check for a logged in admin in polymerfire?
我刚刚从我的单个应用程序 Polymer Web 应用程序的 json 数据存储更改为 polymerfire。我的网络应用程序中的所有数据都是 public,并且只有一个管理员应该更改数据,所以我只有一个顶级节点用于所有页面数据。
对于登录,我将 firebase-auth 元素与 public 提供程序一起使用,并设置了规则以授予我的管理员写入权限。
但现在我正在努力解决如何向登录管理员提供反馈以表明他已登录。为此,我在我的数据库中添加了第二个顶级节点 ('isAdmin'),即只有登录的管理员可读,键为 'Admin',布尔值为 'true'。我试图用 firebase-document 绑定到它,并在 dom-if 模板中使用它,如下所示:
<firebase-auth
id="auth"
user="{{user}}"
provider="google"
app-name="myApp"
signed-in="{{signedIn}}">
</firebase-auth>
<firebase-document
log
id="adminCheck"
app-name="myApp"
path="/isAdmin"
data="{{firebaseAdmin}}">
</firebase-document>
<paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>
<paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button>
<template is="dom-if" if="[[firebaseAdmin.Admin]]" restamp>
<span>Hello [[user.displayName]]!</span>
</template>
然而,由于只有登录的管理员才能读取节点,所以我的 javascript 中的管理员值实际上永远不会改变,只有当我在登录后刷新浏览器时。因此,如果我尝试像这样记录状态:
<script>
Polymer({
is: 'my-login',
properties: {
user: {
type: Object
},
firebaseAdmin: {
type: Object
},
},
_checkAdmin: function() {
var myVal = this.$.adminCheck.getStoredValue('/isAdmin');
console.log('Value for admin stored in firebase-document element: ' + myVal.Admin);
console.log('Polymer property for admin: ' + this.firebaseAdmin.Admin);
},
login: function() {
this.$.auth.signInWithPopup();
this._checkAdmin();
},
logout: function() {
this.$.auth.signOut();
this._checkAdmin();
}
});
</script>
我总是得到:
Value for admin stored in firebase-document element: undefined
Polymer property for admin: undefined
从我的 _checkAdmin 函数返回,即使已登录。只有当我在管理员登录后刷新页面时,我才会从 firebase-document 获得一个日志,其中包含 isAdmin 节点上的存储对象:
Got stored value! Object {Admin: true}
,现在我会一直使用这个值,即使注销也是如此。然后我的 _checkAdmin 函数将始终记录此:
Value for admin stored in firebase-document element: undefined
Polymer property for admin: true
然后我尝试了各种方法都没有成功,但现在我想这不是检查登录管理员的合适方法吗?我只是认为我不应该直接检查 javascript 中的 uid。
如果有专业人士愿意帮助我,Alex
,我很高兴
感谢 Michael Bleigh 的帮助,我终于让它工作了,就像这样:
<dom-module id="my-login">
<template>
<style>
span {
margin-left: 1rem;
}
paper-button {
background: -webkit-linear-gradient(#fff, #333 66%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
<firebase-auth
id="auth"
user="{{user}}"
provider="google"
app-name="myApp"
signed-in="{{signedIn}}">
</firebase-auth>
<firebase-document
app-name="myApp"
path="/admins/[[user.uid]]"
data="{{isAdmin}}">
</firebase-document>
<paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>
<paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button>
<template is="dom-if" if="[[admin]]" restamp>
<span hidden="[[!user]]">Hello [[user.displayName]]!</span>
</template>
</template>
<script>
Polymer({
is: 'my-login',
properties: {
user: {
type: Object
},
isAdmin: {
type: Object
},
admin: {
type: Boolean,
computed: '_checkAdmin(isAdmin)'
}
},
_checkAdmin: function(isAdmin) {
if (typeof isAdmin === 'boolean') {
console.log('Polymer property for admin is defined');
return true;
}
},
login: function() {
this.$.auth.signInWithPopup();
},
logout: function() {
this.$.auth.signOut();
}
});
</script>
解决此问题的典型方法是在实时数据库中将管理员编写为布尔映射:
- admins
- {uid}: true
- {uid}: true
然后您将设置如下安全规则:
{
"admins": {
"$uid": {
".read": "auth.uid === $uid"
}
}
}
这允许每个用户读取他们自己的 admins
节点以检查他们是否是管理员。现在,最后,您将绑定到该位置:
<firebase-auth user="{{user}}"></firebase-auth>
<firebase-document path="/admins/[[user.uid]]" data="{{isAdmin}}"></firebase-document>
对于非管理员,data
将是 null
,对于管理员,登录后将是 true
。另外请注意,您 不能依赖 UI 单独切换为管理员控制。您应该编写安全规则,以便只有 admins
节点中具有 uid 的用户才能写入数据库的管理员保护区域。
我刚刚从我的单个应用程序 Polymer Web 应用程序的 json 数据存储更改为 polymerfire。我的网络应用程序中的所有数据都是 public,并且只有一个管理员应该更改数据,所以我只有一个顶级节点用于所有页面数据。
对于登录,我将 firebase-auth 元素与 public 提供程序一起使用,并设置了规则以授予我的管理员写入权限。
但现在我正在努力解决如何向登录管理员提供反馈以表明他已登录。为此,我在我的数据库中添加了第二个顶级节点 ('isAdmin'),即只有登录的管理员可读,键为 'Admin',布尔值为 'true'。我试图用 firebase-document 绑定到它,并在 dom-if 模板中使用它,如下所示:
<firebase-auth
id="auth"
user="{{user}}"
provider="google"
app-name="myApp"
signed-in="{{signedIn}}">
</firebase-auth>
<firebase-document
log
id="adminCheck"
app-name="myApp"
path="/isAdmin"
data="{{firebaseAdmin}}">
</firebase-document>
<paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>
<paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button>
<template is="dom-if" if="[[firebaseAdmin.Admin]]" restamp>
<span>Hello [[user.displayName]]!</span>
</template>
然而,由于只有登录的管理员才能读取节点,所以我的 javascript 中的管理员值实际上永远不会改变,只有当我在登录后刷新浏览器时。因此,如果我尝试像这样记录状态:
<script>
Polymer({
is: 'my-login',
properties: {
user: {
type: Object
},
firebaseAdmin: {
type: Object
},
},
_checkAdmin: function() {
var myVal = this.$.adminCheck.getStoredValue('/isAdmin');
console.log('Value for admin stored in firebase-document element: ' + myVal.Admin);
console.log('Polymer property for admin: ' + this.firebaseAdmin.Admin);
},
login: function() {
this.$.auth.signInWithPopup();
this._checkAdmin();
},
logout: function() {
this.$.auth.signOut();
this._checkAdmin();
}
});
</script>
我总是得到:
Value for admin stored in firebase-document element: undefined
Polymer property for admin: undefined
从我的 _checkAdmin 函数返回,即使已登录。只有当我在管理员登录后刷新页面时,我才会从 firebase-document 获得一个日志,其中包含 isAdmin 节点上的存储对象:
Got stored value! Object {Admin: true}
,现在我会一直使用这个值,即使注销也是如此。然后我的 _checkAdmin 函数将始终记录此:
Value for admin stored in firebase-document element: undefined
Polymer property for admin: true
然后我尝试了各种方法都没有成功,但现在我想这不是检查登录管理员的合适方法吗?我只是认为我不应该直接检查 javascript 中的 uid。
如果有专业人士愿意帮助我,Alex
,我很高兴感谢 Michael Bleigh 的帮助,我终于让它工作了,就像这样:
<dom-module id="my-login">
<template>
<style>
span {
margin-left: 1rem;
}
paper-button {
background: -webkit-linear-gradient(#fff, #333 66%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
<firebase-auth
id="auth"
user="{{user}}"
provider="google"
app-name="myApp"
signed-in="{{signedIn}}">
</firebase-auth>
<firebase-document
app-name="myApp"
path="/admins/[[user.uid]]"
data="{{isAdmin}}">
</firebase-document>
<paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>
<paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button>
<template is="dom-if" if="[[admin]]" restamp>
<span hidden="[[!user]]">Hello [[user.displayName]]!</span>
</template>
</template>
<script>
Polymer({
is: 'my-login',
properties: {
user: {
type: Object
},
isAdmin: {
type: Object
},
admin: {
type: Boolean,
computed: '_checkAdmin(isAdmin)'
}
},
_checkAdmin: function(isAdmin) {
if (typeof isAdmin === 'boolean') {
console.log('Polymer property for admin is defined');
return true;
}
},
login: function() {
this.$.auth.signInWithPopup();
},
logout: function() {
this.$.auth.signOut();
}
});
</script>
解决此问题的典型方法是在实时数据库中将管理员编写为布尔映射:
- admins
- {uid}: true
- {uid}: true
然后您将设置如下安全规则:
{
"admins": {
"$uid": {
".read": "auth.uid === $uid"
}
}
}
这允许每个用户读取他们自己的 admins
节点以检查他们是否是管理员。现在,最后,您将绑定到该位置:
<firebase-auth user="{{user}}"></firebase-auth>
<firebase-document path="/admins/[[user.uid]]" data="{{isAdmin}}"></firebase-document>
对于非管理员,data
将是 null
,对于管理员,登录后将是 true
。另外请注意,您 不能依赖 UI 单独切换为管理员控制。您应该编写安全规则,以便只有 admins
节点中具有 uid 的用户才能写入数据库的管理员保护区域。