我无法在实时 Firebase 上保存用户数据



我想将每个用户的每个名称、密码和其他信息保存在Firebase实时数据库的一个表中。

这样,我只能看到谁创建了一个帐户,但我无法访问用户的其他信息,如密码、姓名。

用户通过电子邮件和密码的身份验证方法注册,并使用相同的详细信息登录。

如何阻止注册访问特定类型的电子邮件?

public class Register extends AppCompatActivity {
public static final String TAG = "TAG";
EditText mFullName,mEmail,mPassword,mPhone;
Button mRegisterBtn;
TextView mLoginBtn;
FirebaseAuth fAuth;
ProgressBar progressBar;
FirebaseFirestore fStore;
String userID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);

mFullName   = findViewById(R.id.fullName);
mEmail      = findViewById(R.id.Email);
mPassword   = findViewById(R.id.password);
mPhone      = findViewById(R.id.phone);
mRegisterBtn= findViewById(R.id.registerBtn);
mLoginBtn   = findViewById(R.id.createText);
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
progressBar = findViewById(R.id.progressBar);
mRegisterBtn.setOnClickListener(v -> {
final String email = mEmail.getText().toString().trim();
String password = mPassword.getText().toString().trim();
final String fullName = mFullName.getText().toString();
final String phone    = mPhone.getText().toString();
if(TextUtils.isEmpty(email)){
mEmail.setError("Email manquant.");
return;
}
if(TextUtils.isEmpty(password)){
mPassword.setError("Mot de passe manquant.");
return;
}if(password.length() < 8){
mPassword.setError("Le mot de passe doit contenir au moins 8 caractères");
return;
}
progressBar.setVisibility(View.VISIBLE);
// register the user in firebase
fAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(task -> {
if(task.isSuccessful()){
// send verification link
FirebaseUser fuser = fAuth.getCurrentUser();
fuser.sendEmailVerification().addOnSuccessListener(aVoid -> Toast.makeText(Register.this,
"La vérification de l'email a été envoyée.", Toast.LENGTH_LONG).show()).addOnFailureListener(e ->
Log.d(TAG, "Echec: Email non envoyé " ));
Toast.makeText(Register.this, "Compte créé", Toast.LENGTH_LONG).show();
userID = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("users").document(userID);
Map<String,Object> user = new HashMap<>();
user.put("fName",fullName);
user.put("email",email);
user.put("phone",phone);
documentReference.set(user).addOnSuccessListener(aVoid -> Log.d(TAG, "Succès: profil utilisateur crée pour "+ userID))
.addOnFailureListener(e -> Log.d(TAG, "échec" + e.toString()));
startActivity(new Intent(getApplicationContext(),LoginActivity.class));
}else {
Toast.makeText(Register.this, "Cette adresse email est déjà liée à un compte", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
});

});
mLoginBtn.setOnClickListener(v -> startActivity(new Intent(getApplicationContext(),LoginActivity.class)));
}
}

我想将每个用户的每个名称、密码和其他信息保存在Firebase实时数据库的一个表中。

您只需要永远不要以您想要的方式存储用户的凭据,因为以明文形式存储密码是您可能给用户带来的最严重的安全风险之一。参见示例:

  • 为什么我不应该用明文存储密码

有了这个,我只能看到谁创建了一个帐户,但我无法访问用户的其他信息,如密码、姓名。

您看不到任何其他信息,因为当您使用电子邮件和密码对用户进行身份验证时,您所拥有的唯一信息是电子邮件和用户的UID。就这样,没有其他信息了。

如果您希望获得有关用户的其他信息,则应考虑使用其中一个可用的提供程序实现身份验证机制。

如何阻止注册访问特定类型的电子邮件?

您应该考虑使用安全规则。

如何阻止注册访问特定类型的电子邮件?

假设您的数据库树如下所示:

Users ---> uid ----> name 
password
email
etc...

您应该向用户添加另一个名为"blocked"的布尔变量,并将其定义为false。编写一段代码,将该变量更改为true,这样就可以阻止用户。

然后去你的防火基地规则,并把这个代码:

{
"rules": {
"Users":{
"$user":{
".read": "!data.child('blocked').val()",
".write":"auth.uid === $user"
}
}
}
}

如果(!true(用户被阻止并且读取==false,否则用户可以从数据库中读取他的数据并登录。

在上传用户之前,请确保在用户类中创建了一个名为isBlocked 的布尔值

user.put("isBlocked",false);

最新更新