Как проверить авторизовавшегося администратора в polymirefire?
Я только что перешел из хранилища данных json для моего одиночного веб-приложения Polymer на polyfirefire. Все данные в моем веб-приложении являются общедоступными, и только один администратор должен изменять данные, поэтому у меня есть только один верхний узел для всех данных страницы.
Для входа в систему я использую элемент firebase-auth с общедоступным провайдером и установил правила для предоставления прав администратора записи.
Но сейчас я пытаюсь понять, как дать зарегистрированному администратору обратную связь, чтобы показать, что он вошел в систему. Для этого я добавил второй верхний узел в свою базу данных ('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
Затем я безуспешно пытался сделать разные вещи, но теперь я думаю, что это не подходящий способ проверить, авторизован ли администратор? Я просто не думаю, что должен проверять uid в javascript напрямую.
Рад, что любой профессионал будет рядом и хочет помочь мне, Алекс
Благодаря помощи Майкла Блея я наконец заработал, вот так:
<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>
1 ответ
Типичный способ решить эту проблему - написать администраторов в виде логической карты в базе данных реального времени:
- 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
для администраторов при входе в систему. Еще одно замечание: вы не должны полагаться только на переключение пользовательского интерфейса для управления администратором. Вы должны написать свои правила безопасности так, чтобы только пользователь с идентификатором в admins
узел может писать в защищенные администратором области вашей базы данных.