Как проверить авторизовавшегося администратора в 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 узел может писать в защищенные администратором области вашей базы данных.

Другие вопросы по тегам