我将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。为什么会发生这种情况,我该怎么做才能使其起作用?
提前致谢 :)
我对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
任何人都知道如何验证基础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) 我对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
我在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) 我正在研究一个项目,我学习了几个教程,以便学习和构建应用程序.但是所有这些,他们将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
数据库规则:
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
我正在尝试使用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数据库中,并且位于指定的正确路径中.
有人有主意吗?谢谢
当用户注册并在Firestore中初始化数据时,我想确认他们没有尝试设置自己的角色(例如,因此他们没有将其设置为“ admin”)。
我试着这样写:
match /users/{userId} {
allow create: if (signedInAs(userId) && !request.resource.data.role) || isAdmin();
...
Run Code Online (Sandbox Code Playgroud)
...但是我只是看到“对象上的属性角色未定义”。
有没有办法安全地做到这一点?还是这意味着我应该总是初始化期望的字段,即使只是空字符串也是如此?这似乎与NoSQL的哲学不太吻合?
我在Firestore开发数据库上设置了多个不同的索引.现在,我想将它们导出到firestore.indexes.json这样,以便设置prod环境的过程更容易.有没有办法使用Firebase CLI导出这些索引?这同样适用于安全规则,虽然我知道我可以复制粘贴它们.