标签: firebase-security-rules

Firebase数据库规则-获取displayName

我将Firebase添加到我的网站并创建了一个注册表单。当用户单击“注册”按钮时,它将使用“ Firebase身份验证”创建用户,然后更新用户的displayName,最后将有关该用户的一些数据添加到数据库中:

firebase.auth().createUserWithEmailAndPassword(email, password).then(function () {

    profile = firebase.auth().currentUser;

    profile.updateProfile({
       displayName: "name-value"
    }).then(function() {

        // Update successful.

        firebase.database().ref("/users/" + profile.uid).set({
            data:{
                country: "country-value",
                city: "city-value"
            }
        });
    });
}).catch(function(error) {
    // Handle Errors here.
});
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我从以下位置更改数据库规则:

{
    "rules": {
        ".read": true,
        ".write": true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至:

{
    "rules": {
        "users": {
            ".read": true,
            "$user": {
                ".write": "auth.token.name !== null"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用了auth.token.name,因为它是在指南中写的,用来检查用户的displayName是否存在(我计划稍后再检查它的更多内容)。尽管我之前设置了displayName,但“ firebase规则”以某种方式“认为” auth.token.name等于null。为什么会发生这种情况,我该怎么做才能使其起作用?

提前致谢 :)

firebase firebase-realtime-database firebase-security-rules

5
推荐指数
1
解决办法
608
查看次数

Cloud Firestore ReactJS错误:权限丢失或不足

我对Cloud Firestore特别安全的角色相当新,但由于它们非常重要,我宁愿启动围绕它们的项目的新构建.

现在作为一个基本的见解,我有一个仪表板,用户必须使用他们的电子邮件地址和密码登录,然后他们可以访问区域信息等数据.从安全规则开始,我认为我开始时很简单,但正如标题所述我得到的:

Error: Missing or insufficient permissions

我查看了https://firebase.google.com/docs/firestore/solutions/role-based-access

service cloud.firestore {
  match /databases/{database}/documents {
      match /regions/{region} {
        function isSignedIn() {
          return request.auth != null;
        }

        function getRole(rsc) {
          // Read from the "roles" map in the resource (rsc).
          return rsc.data.roles[request.auth.uid];
        }

        function isOneOfRoles(rsc, array) {
          // Determine if the user is one of an array of roles
          return isSignedIn() && (getRole(rsc) in array);
        }

                // Any role can read regions.
        allow read: if isOneOfRoles(resource, ['owner', 'writer', 'commenter', 'reader']); …
Run Code Online (Sandbox Code Playgroud)

firebase reactjs google-cloud-firestore firebase-security-rules

5
推荐指数
0
解决办法
1010
查看次数

类型的firestore数据库验证

任何人都知道如何验证基础instanceof

这似乎是一个没有脑子的检查,但我在文档中找不到这种类型的验证的参考,我的尝试是不正确的.

如果值不是a,我想失败Date.它可能是Timestamp当前版本的firestore中的一个.

尝试失败

allow write: if request.resource.data.date instanceof Date;
allow write: if request.resource.data.date instanceof Timestamp;
allow write: if !!Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp.date(request.data.date);
allow write: if !!Timestamp.date(request.data.date);
allow write: if !!Timestamp(request.data.date);
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

5
推荐指数
1
解决办法
1139
查看次数

@ firebase / testing-如何在Firestore规则测试中使用auth自定义声明?

我对Firestore Rules的所有测试几乎都不错。但是,我仍然需要测试管理员的一些路径。

我的应用程序中的管理员不是Firebase管理员,而是具有在customClaims中设置如下权限的用户:

claims: {admin: true}

如何使用npm软件包模拟用户customClaims @firebase/testing?我不知道。

谢谢

PS:下面,我正在做什么。

export default class TestApplication {

  public static getFirestoreInstance(auth, projectId: string): firebase.firestore.Firestore {
    return firebase
       .initializeTestApp({projectId, auth})
       .firestore();
  }
}


describe(){
    const defaultAuthUser = {uid: "alice", email: "alice@example.com", "token": {"admin": true};

    before(done => {
        currentProjectId = TestUtils.getRandomId();
        TestApplication.useFirestoreRules(currentProjectId, rules)
          .then(() => done())
          .catch(done);
    });

    it("I should be able to get another user if I'm an admin", () => {
      return firebase.assertSucceeds(
        TestApplication.getFirestoreInstance(defaultAuthUser, currentProjectId)
          .collection(FirebaseReference.USERS_REF)
          .doc(otherUserId)
          .get()
      );
    }).timeout(5000);
}
Run Code Online (Sandbox Code Playgroud)

testing firebase google-cloud-firestore firebase-security-rules

5
推荐指数
2
解决办法
878
查看次数

Firestore Javascript查询与此安全规则结构匹配的内容

我在Firebase控制台中为Firestore测试了这个安全规则结构,我认为它符合我的要求,即在组织级别为用户保留角色映射,并通过始终使用该方法引用父组织来强制执行组织子集合的权限get().

service cloud.firestore {
  match /databases/{database}/documents {

    // ORGANIZATIONS collection
    match /organizations/{organization} {

      function isSignedIn() {
        return request.auth != null;
      }
      function getRole(rsc) {
        // Read from the 'roles' map in the resource (rsc)
        return rsc.data.roles[request.auth.uid];
      }
      function isOneOfRoles(rsc, array) {
        // Determine if the user is one of an array of roles
        return isSignedIn() && (getRole(rsc) in array);
      }

      allow write: if isSignedIn();
      allow read: if isSignedIn() && isOneOfRoles(resource, ['owner']);

      // PROJECTS subcollection …
Run Code Online (Sandbox Code Playgroud)

javascript google-cloud-firestore firebase-security-rules

5
推荐指数
0
解决办法
70
查看次数

如何将firebase与读写规则一起使用为false

我正在研究一个项目,我学习了几个教程,以便学习和构建应用程序.但是所有这些,他们将Firebase的读写规则更改为true,这是不安全的.例如他们改变了

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
Run Code Online (Sandbox Code Playgroud)

{
  "rules": {
    ".read": true,
    ".write": true
  }
}
Run Code Online (Sandbox Code Playgroud)

这使得任何人都可以以任何方式读取和写入不安全的服务器数据.因此我把它变成了假,现在我无法将用户注册到Firebase,它发出的错误是"权限被拒绝".那么我现在必须做什么才能获得许可.

以前我使用此代码将用户注册到Firebase现在不能正常工作.

mFirebaseAuth.createUserWithEmailAndPassword(editEmail.getText().toString(), editPass.getText().toString()).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {

                        //Saving User to Database

                        User user = new User();
                        user.setEmail(editEmail.getText().toString());
                        user.setName(editName.getText().toString());
                        user.setPassword(editPass.getText().toString());
                        user.setPhone(editPhone.getText().toString());


                        users.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).setValue(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                waitingdialog.dismiss();
                                Snackbar.make(rootLayout, "Registration Successful", Snackbar.LENGTH_SHORT).show();
                                return;
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                waitingdialog.dismiss();
                                Snackbar.make(rootLayout, "Registration Failed" + e.getMessage(), Snackbar.LENGTH_LONG).show();
                                return;
                            } …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-authentication firebase-realtime-database firebase-security-rules

4
推荐指数
1
解决办法
5233
查看次数

PERMISSION_DENIED,当实际允许权限时

数据库规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

存储规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它说 Anyone with your database reference will be able to read or write to your database

我得到的错误:

Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied
    at firebase.js:1
    at exceptionGuard (firebase.js:1)
    at e.callOnCompleteCallback (firebase.js:1)
    at firebase.js:1
    at firebase.js:1
    at t.onDataMessage_ (firebase.js:1)
    at e.onDataMessage_ (firebase.js:1)
    at e.onPrimaryMessageReceived_ (firebase.js:1)
    at e.onMessage (firebase.js:1) …
Run Code Online (Sandbox Code Playgroud)

javascript firebase firebase-realtime-database firebase-security-rules

4
推荐指数
1
解决办法
4040
查看次数

Firestore Rules Simulator - 资源未定义

我正在尝试使用firebase提供的新规则模拟器工具,但是我遇到了让它工作的问题

在模拟器面板中设置这样的路径时

/users/Gd9jd3jd8sSixxx38djSs
Run Code Online (Sandbox Code Playgroud)

然后选择身份验证选项并将授权用户的uid作为相同的字符串Gd9jd3jd8sSixxx38djSs输入.使用此firestore规则时出现以下错误

match /users/{user}{
     allow read: if request.auth.uid == resource.id
}
Run Code Online (Sandbox Code Playgroud)

"错误:simulator.rules行[4],列[41].对象上的属性id未定义."

此文档确实存在于我的firestore数据库中,并且位于指定的正确路径中.

有人有主意吗?谢谢

firebase google-cloud-firestore firebase-security-rules

4
推荐指数
1
解决办法
1406
查看次数

Firestore安全规则:如何验证字段未定义?

当用户注册并在Firestore中初始化数据时,我想确认他们没有尝试设置自己的角色(例如,因此他们没有将其设置为“ admin”)。

我试着这样写:

match /users/{userId} {
  allow create: if (signedInAs(userId) && !request.resource.data.role) || isAdmin();
  ...
Run Code Online (Sandbox Code Playgroud)

...但是我只是看到“对象上的属性角色未定义”。

有没有办法安全地做到这一点?还是这意味着我应该总是初始化期望的字段,即使只是空字符串也是如此?这似乎与NoSQL的哲学不太吻合?

firebase google-cloud-firestore firebase-security-rules

4
推荐指数
1
解决办法
837
查看次数

如何从Firestore导出安全性和索引规则?

我在Firestore开发数据库上设置了多个不同的索引.现在,我想将它们导出到firestore.indexes.json这样,以便设置prod环境的过程更容易.有没有办法使用Firebase CLI导出这些索引?这同样适用于安全规则,虽然我知道我可以复制粘贴它们.

firebase google-cloud-firestore firebase-security-rules

3
推荐指数
3
解决办法
1528
查看次数