【发布时间】:2019-01-31 23:16:09
【问题描述】:
我正在使用 Firebase 设置注册/登录应用程序。在我的实时数据库中,我有两个孩子,“供应商”和“食客”,它们都在“客户”父级下。当用户注册时,它会将他们的信息正确保存到 Firebase 身份验证选项卡,但是当我转到实时数据库选项卡时,它不会在任何孩子中显示用户 ID。
我已经尝试使用 DatabaseReference 将用户 ID 存储到正确的孩子,但它似乎没有将用户 ID 存储到数据库,它只将用户存储到身份验证。
public class VendorLoginActivity extends AppCompatActivity {
private EditText emailEditText;
private EditText passwordEditText;
private Button loginButton;
private Button registrationButton;
private FirebaseAuth firebaseAuth;
private FirebaseAuth.AuthStateListener fbAuthenticationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vendor_login);
emailEditText = findViewById(R.id.email_edit_text);
passwordEditText = findViewById(R.id.password_edit_text);
loginButton = findViewById(R.id.login_button);
registrationButton = findViewById(R.id.registration_button);
firebaseAuth = FirebaseAuth.getInstance();
fbAuthenticationListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser fbUser = FirebaseAuth.getInstance().getCurrentUser();
if (fbUser != null ){
startActivity(new Intent(VendorLoginActivity.this, MainActivity.class));
finish();
return;
}
}
};
// Registration Button Clicked
registrationButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String emailUser = emailEditText.getText().toString();
final String passwordUser = passwordEditText.getText().toString();
firebaseAuth.createUserWithEmailAndPassword(emailUser, passwordUser).addOnCompleteListener(VendorLoginActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
Toast.makeText(VendorLoginActivity.this, R.string.registration_fail_toast, Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(VendorLoginActivity.this, R.string.registration_success_toast, Toast.LENGTH_SHORT).show();
String client_id = firebaseAuth.getCurrentUser().getUid();
DatabaseReference client_db = FirebaseDatabase.getInstance().getReference().child("Clients").child("Vendor").child(client_id);
client_db.setValue(true);
}
}
});
}
});
// Login Button Clicked
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String emailUser = emailEditText.getText().toString();
final String passwordUser = passwordEditText.getText().toString();
firebaseAuth.signInWithEmailAndPassword(emailUser, passwordUser).addOnCompleteListener(VendorLoginActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
Toast.makeText(VendorLoginActivity.this, R.string.login_failed_toast, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(VendorLoginActivity.this, R.string.login_success_toast, Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
@Override
protected void onStart() {
super.onStart();
firebaseAuth.addAuthStateListener(fbAuthenticationListener);
}
@Override
protected void onStop() {
super.onStop();
firebaseAuth.removeAuthStateListener(fbAuthenticationListener);
}
}
我希望 userId 显示在 Firebase 实时数据库子“供应商”或“食客”中(取决于用户在欢迎屏幕上首次按下的按钮),但 Firebase 实时数据库不会在任何孩子们“供应商”或“食客”。
【问题讨论】:
-
我不确定我是否理解问题所在。如果在调试器中运行代码,
client_db.setValue(true);会被执行吗? -
是的,client_db_setValue(true) 确实被执行了。事实上,它在调试中也显示了用户 ID,因此它工作正常。当我转到 Firebase 网站时,身份验证选项卡显示了我通过注册创建的用户,但是当我转到 Firebase 数据库时,它没有显示应该在正确子项下创建的用户 ID,它只是显示为空。是因为在数据库规则中我将读写设置为 false 吗? drive.google.com/file/d/1siaEJlrGqZKZ-xrRgW_ByaTQxDB4Sntt/…
-
是的,这肯定可以解释。见firebase.google.com/docs/database/security/…
-
太棒了,谢谢!不过,这让我想知道,因为这不是最终版本中应该有的样子,我将如何获取用户 ID,同时使其可以在没有任何安全问题的情况下发布,因为我将无法使用规则读写设置为true?感谢您的帮助和指导!
-
研究有关安全规则的文档,尝试建立您的安全规则,如果您遇到困难,请回复一个具体的问题。有关如何执行此操作的提示,请参阅 how to create a minimal, complete, verifiable example。
标签: android firebase-realtime-database