Firebase 实时数据库规则不允许经过身份验证的用户写入
Firebase Realtime Database rules are disallowing write from authenticated user
我对 Firebase 实时数据库规则有疑问。我用 mAuth.createUserWithEmailAndPassword(email, password)
注册了一个新用户。在 onCompleteMethod
中,我想在实时数据库中添加我自己的用户对象。
我这样做是因为每个用户都有 email/password.
的附加信息
我检查后
FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
//do something
} else {
createNewUser(fireUser);
}
方法
private void createNewUser(FirebaseUser fireUser) {
// Build the user-object.
User user = new User();
user.setUserId(fireUser.getUid());
user.setUsername(name);
user.setSex(sex);
user.setEmail(email);
user.setAge(time);
user.setImageUri("");
// Create database connection and reference.
DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference();
mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user);
}
被调用。但由于某种原因,抛出了这个 DatabaseError:
W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied
根据我的理解,如果 FirebaseUser 不为空 - 他已登录,因此我的规则在 Firebase 中声明
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
将允许用户写入数据库。但是,当我将规则更改为 ".read": "true"
和 ".write": "true"
.
时,此代码才有效
所以我的问题是:我在这里做错了什么?我只希望经过身份验证的用户 read/write.
感谢您的帮助!
编辑
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
loadingPanel.setVisibility(View.GONE);
} else {
loadingPanel.setVisibility(View.GONE);
FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show();
}
// Send verification mail
sendVerificationEmail(fireUser);
// Create a new User!
createNewUser(fireUser);
//start intent and sign out.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
FirebaseAuth.getInstance().signOut();
startActivity(intent);
finish();
}
}
数据库写入未同步完成。您要在数据库操作完成之前注销:
//start intent and sign out.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
FirebaseAuth.getInstance().signOut(); // <== Can't do this here!
startActivity(intent);
finish();
在 createNewUser()
中,您可以将带有日志语句的 CompletionListener
添加到 setValue()
调用以查看写入何时完成。您还可以添加 AuthStateListener
with log 语句来检测 sign-in/sign-outs 何时完成。这些日志应确认在数据库写入之前注销已完成。
我对 Firebase 实时数据库规则有疑问。我用 mAuth.createUserWithEmailAndPassword(email, password)
注册了一个新用户。在 onCompleteMethod
中,我想在实时数据库中添加我自己的用户对象。
我这样做是因为每个用户都有 email/password.
我检查后
FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
//do something
} else {
createNewUser(fireUser);
}
方法
private void createNewUser(FirebaseUser fireUser) {
// Build the user-object.
User user = new User();
user.setUserId(fireUser.getUid());
user.setUsername(name);
user.setSex(sex);
user.setEmail(email);
user.setAge(time);
user.setImageUri("");
// Create database connection and reference.
DatabaseReference mDatabaseRef = FirebaseDatabase.getInstance().getReference();
mDatabaseRef.child("users").child(fireUser.getUid()).setValue(user);
}
被调用。但由于某种原因,抛出了这个 DatabaseError:
W/RepoOperation: setValue at /users/9i6loj4BlCWkgkXOULWxbCSlvnx1 failed: DatabaseError: Permission denied
根据我的理解,如果 FirebaseUser 不为空 - 他已登录,因此我的规则在 Firebase 中声明
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
将允许用户写入数据库。但是,当我将规则更改为 ".read": "true"
和 ".write": "true"
.
所以我的问题是:我在这里做错了什么?我只希望经过身份验证的用户 read/write.
感谢您的帮助!
编辑
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
loadingPanel.setVisibility(View.GONE);
} else {
loadingPanel.setVisibility(View.GONE);
FirebaseUser fireUser = FirebaseAuth.getInstance().getCurrentUser();
if(fireUser == null) {
Toast.makeText(getApplicationContext(), "User is null", Toast.LENGTH_SHORT).show();
}
// Send verification mail
sendVerificationEmail(fireUser);
// Create a new User!
createNewUser(fireUser);
//start intent and sign out.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
FirebaseAuth.getInstance().signOut();
startActivity(intent);
finish();
}
}
数据库写入未同步完成。您要在数据库操作完成之前注销:
//start intent and sign out.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
FirebaseAuth.getInstance().signOut(); // <== Can't do this here!
startActivity(intent);
finish();
在 createNewUser()
中,您可以将带有日志语句的 CompletionListener
添加到 setValue()
调用以查看写入何时完成。您还可以添加 AuthStateListener
with log 语句来检测 sign-in/sign-outs 何时完成。这些日志应确认在数据库写入之前注销已完成。