Android 如何仅允许当前用户在Firebase中为新用户创建帐户

Android 如何仅允许当前用户在Firebase中为新用户创建帐户,android,firebase-realtime-database,firebase-authentication,Android,Firebase Realtime Database,Firebase Authentication,我正在尝试建立一个只有当前用户才能为新用户创建帐户的应用程序。我有两种类型的用户:医生和病人。只有医生才能为他们的病人建立账户。到目前为止,Iv创建了一个Firebase数据库,它似乎正在工作,但现在已经停止。患者现在正在进行身份验证,但他们的信息没有被添加到数据库中。我认为问题在于当前用户登录时尝试创建新用户。是否允许用户在不作为新创建的用户登录的情况下创建新用户 此代码创建患者帐户并将其添加到Firebase public class PatientRegister extends App

我正在尝试建立一个只有当前用户才能为新用户创建帐户的应用程序。我有两种类型的用户:医生和病人。只有医生才能为他们的病人建立账户。到目前为止,Iv创建了一个Firebase数据库,它似乎正在工作,但现在已经停止。患者现在正在进行身份验证,但他们的信息没有被添加到数据库中。我认为问题在于当前用户登录时尝试创建新用户。是否允许用户在不作为新创建的用户登录的情况下创建新用户

此代码创建患者帐户并将其添加到Firebase

 public class PatientRegister extends AppCompatActivity {
 EditText FirstName,LastName,PatientEmail,PatientPassword;
 Button CreateAccount;
 FirebaseAuth mAuth2;
 AuthStateListener firebaseAuthStateListener;

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_patient_register);

    FirstName = findViewById(R.id.fName);
    LastName = findViewById(R.id.lName);
    PatientEmail = findViewById(R.id.patientEmail);
    PatientPassword = findViewById(R.id.patientPassword);
    CreateAccount = findViewById(R.id.addPatient);
    mAuth2 = FirebaseAuth.getInstance();

     firebaseAuthStateListener = new FirebaseAuth.AuthStateListener() {
         @Override
         public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
             final FirebaseUser patientAcc = FirebaseAuth.getInstance().getCurrentUser();
             if (patientAcc != null){

             } } };
    CreateAccount.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String fname = FirstName.getText().toString();
            final String lname = LastName.getText().toString();
            final String patientemail = PatientEmail.getText().toString();
            final String patientpassword = PatientPassword.getText().toString();

            startActivity(new Intent(getApplicationContext(),PatientAccount.class));

            mAuth2.createUserWithEmailAndPassword(patientemail,patientpassword).addOnCompleteListener(PatientRegister.this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (!task.isSuccessful()) {
                        Toast.makeText(PatientRegister.this, "sign up error", Toast.LENGTH_SHORT).show();
                    } else {
                        String patientId = mAuth2.getCurrentUser().getUid();
                        DatabaseReference PatientDataBase = FirebaseDatabase.getInstance().getReference().child("Patient").child(patientId);
                        Map<String, Object> patient = new HashMap<>();
                        patient.put("Last Name", lname);
                        patient.put("First Name", fname);
                        patient.put("Patient Email", patientemail);
                        PatientDataBase.updateChildren(patient);
                    } }}); } }); }
 @Override
protected void onStart() {
    super.onStart();
    mAuth2.addAuthStateListener(firebaseAuthStateListener);
}

@Override
protected void onStop() {
    super.onStop();
    mAuth2.removeAuthStateListener(firebaseAuthStateListener);
  }}
公共类PatientRegister扩展AppCompative活动{
编辑文本名、姓氏、PatientMail、PatientPassword;
按钮创建帐户;
FirebaseAuth mAuth2;
AuthStateListener firebaseAuthStateListener;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u patient\u register);
FirstName=findviewbyd(R.id.fName);
LastName=findviewbyd(R.id.lName);
PatientEmail=findViewById(R.id.PatientEmail);
PatientPassword=findViewById(R.id.PatientPassword);
CreateAccount=findViewById(R.id.addPatient);
mAuth2=FirebaseAuth.getInstance();
firebaseAuthStateListener=新的FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
final FirebaseUser patientAcc=FirebaseAuth.getInstance().getCurrentUser();
if(patientatac!=null){
} } };
CreateCount.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最后一个字符串fname=FirstName.getText().toString();
最后一个字符串lname=LastName.getText().toString();
最后一个字符串patientemail=patientemail.getText().toString();
最后一个字符串patientpassword=patientpassword.getText().toString();
startActivity(新意图(getApplicationContext(),PatientAccount.class));
mAuth2.createUserWithEmailAndPassword(PatientMail,patientpassword).addOnCompleteListener(PatientRegister.this,new OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
如果(!task.issusccessful()){
Toast.makeText(PatientRegister.this,“注册错误”,Toast.LENGTH_SHORT.show();
}否则{
字符串patientId=mAuth2.getCurrentUser().getUid();
DatabaseReference PatientDataBase=FirebaseDatabase.getInstance().getReference().child(“患者”).child(patientId);
Map patient=new HashMap();
患者姓名(“姓氏”,lname);
患者姓名(“名字”,fname);
patient.put(“患者电子邮件”,patientemail);
PatientDataBase.updateChildren(患者);
} }}); } }); }
@凌驾
受保护的void onStart(){
super.onStart();
mAuth2.addAuthStateListener(firebaseAuthStateListener);
}
@凌驾
受保护的void onStop(){
super.onStop();
mAuth2.removeAuthStateListener(firebaseAuthStateListener);
}}

这在客户端应用程序中是不可能的。Firebase身份验证只允许单个用户在任何给定时间登录。当您使用Email和Password调用
CreateUsers时,这将有效地创建新用户并同时让他们登录。然后,原始用户将立即注销

如果希望用户能够正确创建其他用户,则需要在您控制的后端上使用。它可以,包括创建新帐户。您的应用程序必须以某种方式调用此后端。

请参见,尽管我现在建议采用Doug概述的方法,而不是André在接受的答案中所显示的方法。