Firebase Firestore规则不允许使用自定义JWT对使用CustomToken用户的SigninWithToken进行声明

Firebase Firestore规则不允许使用自定义JWT对使用CustomToken用户的SigninWithToken进行声明,firebase,google-cloud-firestore,firebase-authentication,firebase-security,Firebase,Google Cloud Firestore,Firebase Authentication,Firebase Security,我有一套结构化的Firestore规则,除了自定义JWT中的自定义用户声明之外,其他一切都可以正常工作 我使用的是Laravel框架,如下所示: firebase.auth().signInWithCustomToken(firebase_custom_token); 'firebase\u custom\u token'=>(字符串)$firebase->getAuth()->createCustomToken( “mrp管理员用户:{$user->id}”[ “isPanel”=>正确,

我有一套结构化的Firestore规则,除了自定义JWT中的自定义用户声明之外,其他一切都可以正常工作

我使用的是Laravel框架,如下所示:

firebase.auth().signInWithCustomToken(firebase_custom_token);
'firebase\u custom\u token'=>(字符串)$firebase->getAuth()->createCustomToken(
“mrp管理员用户:{$user->id}”[
“isPanel”=>正确,
'userRoles'=>$user->roleIds//返回类似['admin','operator'的数组
]
)
然后在客户端,我成功登录Firebase,如下所示:

firebase.auth().signInWithCustomToken(firebase_custom_token);
我有一个Firestore规则函数,通过检查
isPanel==true
令牌声明来检查用户是否为面板用户:

function isPanelUser() {
  return request.auth != null && 
    'isPanel' in request.auth.token && 
    request.auth.token.isPanel == true
}
使用该函数的所有操作都会失败,并导致权限丢失或不足错误:

match /users/{userId}/{document=**} {
  allow read, write: if isSignedInAs(userId) || isPanelUser();
}

match /system/services/{serviceId}/{document=**} {
  allow read;
  allow write: if isPanelAdmin();
}
Firestore规则: 编辑

以下是写入
system/config
文档的javascript代码:

注意:如果我从
系统/配置
规则中删除了书面检查,那么它将工作并写入文档

import firebase from "firebase/app";
import 'firebase/firestore';

...

const systemConfigRef = firebase.firestore().collection('system').doc('config');

systemConfigRef.set({
  status: 'down'
})
.then(docRef => {
  console.log('System config written');
})
.catch(error => {
  console.log('System config error', error); // getting permissions error
});

系统/配置位置的规则如下:

match /system/config {
  allow read;
  allow write: if isPanelAdmin();
}
您要求用户成为panelAdmin,这比仅仅作为panel用户有更严格的要求:

function isPanelAdmin() {
      return isPanelUser() == true && 
      'userRoles' in request.auth.token && (
        'admin' in request.auth.token.userRoles || 
        'super-admin' in request.auth.token.userRoles
      )
    }
您都要求userRoles数组位于令牌上,并且要求“admin”或“super admin”位于该数组中。你绝对肯定吗

'userRoles' => $user->roleIds

返回包含admin或super admin的数组?我建议将规则切换为只调用
isPanelUser
而不是
isPanelAdmin
,以便进行测试。

您可以将写入数据库的代码发布到数据库吗?@zavtra我已经用代码更新了问题,但该代码是正确的。如果我更改
允许写入:If isPanelAdmin()
允许写入
system/config
规则中,它工作并写入文档。您完全正确!事实证明,Laravel Elount用户模型与roles表的关系错误,返回的是一个空数组!我已经让这个工作,但我改变了用户模型,我完全忘记了它!我很确定它在工作!谢谢你+1!