如何在polymerfire中检查已登录的管理员?

时间:2017-04-03 13:37:36

标签: firebase polymerfire firebase-polymer

我刚从我的单个应用程序Polymer web app的json数据存储区更改为polymerfire。我的网络应用程序中的所有数据都是公开的,只有一个管理员应该更改数据,所以我只有一个顶级节点用于所有页面数据。

对于登录,我将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中的admin值实际上永远不会更改。所以,如果我尝试像这样记录状态:

<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函数返回,即使已登录。只有当我在管理员登录后刷新页面时,我才会从isAdmin节点上的存储对象的firebase文档中获取日志:

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>

1 个答案:

答案 0 :(得分:2)

解决此问题的典型方法是将管理员编写为实时数据库中的布尔图:

- 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的用户才能写入数据库的管理保护区域。

相关问题