Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何在polymerfire中检查已登录的管理员?_Firebase_Polymerfire_Firebase Polymer - Fatal编程技术网

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

Firebase 如何在polymerfire中检查已登录的管理员?,firebase,polymerfire,firebase-polymer,Firebase,Polymerfire,Firebase Polymer,我刚刚从我的单一应用Polymer web应用的json数据存储更改为polymerfire。我的web应用程序中的所有数据都是公共的,只有一个管理员应该更改数据,所以我只有一个顶部节点用于所有页面数据 对于登录,我将firebase auth元素与公共提供者一起使用,并设置了授予管理员写入权限的规则 但现在我正在努力解决如何给登录的管理员一个反馈,以表明他已登录。为此,我在数据库中添加了第二个顶级节点('isAdmin'),该节点仅对登录的管理员可读,键为'admin',布尔值为'true'。

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

对于登录,我将firebase auth元素与公共提供者一起使用,并设置了授予管理员写入权限的规则

但现在我正在努力解决如何给登录的管理员一个反馈,以表明他已登录。为此,我在数据库中添加了第二个顶级节点('isAdmin'),该节点仅对登录的管理员可读,键为'admin',布尔值为'true'。我已尝试使用firebase文档绑定到该文档,并在dom模板中使用它,如果这样:

    <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>
<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>
<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>
,现在即使注销,我也会被这个值卡住。My_checkAdmin函数将始终记录以下内容:

Value for admin stored in firebase-document element: undefined
Polymer property for admin: true
然后我尝试了各种各样的方法,但都没有成功,但现在我想这不是检查登录管理员的合适方法?我只是觉得我不应该直接在javascript中检查uid

如果有专业人士愿意帮助我,我很高兴,亚历克斯

多亏了Michael Bleigh的帮助,我终于成功了,就像这样:

    <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>
<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>
<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 em;
}
纸扣{
背景:-webkit线性梯度(#fff,#333 66%);
-webkit背景剪辑:文本;
背景剪辑:文本;
-webkit文本填充颜色:透明;
}
登录
注销
您好[[user.displayName]]!
聚合物({
是:'我的登录',
特性:{
用户:{
类型:对象
},
伊萨明:{
类型:对象
},
管理员:{
类型:布尔型,
计算:“_checkAdmin(isAdmin)”
}
},            
_checkAdmin:函数(isAdmin){
if(iAdmin的类型=='boolean'){
log(“定义了管理员的属性”);
返回true;
}
},
登录:函数(){
此.$.auth.signInWithPopup();
},
注销:函数(){
这是$.auth.signOut();
}
});

解决此问题的典型方法是将管理员作为布尔映射写入实时数据库:

- admins
  - {uid}: true
  - {uid}: true
然后设置安全规则,如:

{
  "admins": {
    "$uid": {
      ".read": "auth.uid === $uid"
    }
  }
}
这允许每个用户读取自己的
管理员
节点,以检查他们是否是管理员。现在,最后,您将绑定到该位置:

<firebase-auth user="{{user}}"></firebase-auth>
<firebase-document path="/admins/[[user.uid]]" data="{{isAdmin}}"></firebase-document>


登录时,非管理员的
数据将
null
,管理员的
true
。另一个注意事项是,您不能仅依靠UI切换进行管理控制。您应该编写安全规则,以便只有在“管理员”节点中具有uid的用户才能写入数据库的管理员保护区域。

解决此问题的典型方法是将管理员作为布尔映射写入实时数据库:

- admins
  - {uid}: true
  - {uid}: true
然后设置安全规则,如:

{
  "admins": {
    "$uid": {
      ".read": "auth.uid === $uid"
    }
  }
}
这允许每个用户读取自己的
管理员
节点,以检查他们是否是管理员。现在,最后,您将绑定到该位置:

<firebase-auth user="{{user}}"></firebase-auth>
<firebase-document path="/admins/[[user.uid]]" data="{{isAdmin}}"></firebase-document>


登录时,非管理员的
数据将
null
,管理员的
true
。另一个注意事项是,您不能仅依靠UI切换进行管理控制。您应该编写安全规则,以便只有在
admins
节点中具有uid的用户才能写入数据库的管理员保护区域。

这非常有效,非常感谢!我想我错了,因为我认为我不需要动态uid路径,因为我只有一个管理员。这很好用,非常感谢!我想我错了,因为我认为我不需要动态uid路径,因为我只有一个管理员。