创建Firebase登录名,并且不要更改FirebaseAuth

时间:2019-07-07 17:06:22

标签: firebase-realtime-database firebase-authentication

在我的android应用中,有2种类型的帐户(管理员和用户)。管理员可以创建一个用户帐户。问题是,从管理员创建用户帐户后,FirebaseAuth更改为我不需要的新用户。

用例是: 管理员创建一个用户帐户。用户稍后将通过自己的设备登录。 (管理员和用户都属于同一公司,为了方便使用,我选择了这种方法)

有没有办法在firebase中创建帐户,并且FirebaseAuth保持不变?

谢谢。

我已经尝试在创建Uesr帐户后重新登录Admin,但同时,由于安全规则,所有的监听器都会被触发(onCancelled())。所以这种方法行不通

-尝试链接的Soln之后:

我还需要在Users表中添加记录,所以我这样做是这样的:

mSecondaryAuth.createUserWithEmailAndPassword(email, password){
               .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                   @Override
                   public void onComplete(@NonNull Task<AuthResult> task) {

                          // Change myRef to secondaryDatabase.. otherwise permission denied error is given on setValue()
                          if(ADMINCREATINGUSER) {
                            FirebaseDatabase database = FirebaseDatabase.getInstance(secondaryAuth);
                            myRef = database.getReference("Users");
                          }

                          myRef.child(userid).setValue(user, new DatabaseReference.CompletionListener(){
                              @Override
                              public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) 
                              {
                                 // No Error, but nothing created in DB as well.                                    
                              }
                           });


                   }
}

我现在的问题是,即使没有报告错误,为什么在数据库中什么也不创建。

Firebase安全规则:

{
 "rules": {
    "Users" : {
        "$authid" :{
          ".read" : "auth.uid === $authid",
        ".write" : "auth.uid === $authid"
    }
  },

运行规则模拟器也可以。

1 个答案:

答案 0 :(得分:1)

前一段时间我遇到过同样的问题。

我是怎么解决的

只需将管理员UID存储到共享首选项中,因此,每次在管理员中创建新用户时,我都会为该用户分配创建它的管理员的UID。

此外,如果您以其他管理员身份登录,只需用登录的当前管理员uid覆盖sharedprefs中的当前UID。

这样做,您可以继续在admin ID中创建和存储用户

如果找到该实现的代码,我将在此处发布

编辑

找到了一些可以帮助您理解的代码

例如,创建一个新用户

public void cargarPacienteFirebase(String email, String password, final String nombre, final String apellido, final Dialog mDialog) {

        SharedPreferences prefs = mContext.getSharedPreferences("ADMINUID", Context.MODE_PRIVATE);
        final String adminUID = prefs.getString("adminuid", "defaultValue");

        final UserModel userModel = new UserModel();
        userModel.setNombre(nombre);
        userModel.setApellido(apellido);
        final ProgressDialog pd = new ProgressDialog(mContext);
        pd.setMessage("Estamos cargando su paciente...");
        pd.setCancelable(false);
        pd.show();

        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    pd.dismiss();
                    final String pacienteID = task.getResult().getUser().getUid();

                    SharedPreferences settings = mContext.getSharedPreferences("PACIENTEUID", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString("pacienteuid", pacienteID);
                    editor.apply();


                    Map<String, Object> mapUsuario = new HashMap<>();
                    mapUsuario.put("nombre", userModel.getNombre());
                    mapUsuario.put("apellido", userModel.getApellido());
                    mapUsuario.put("pregunta", 0);
                    mDatabase.child("Test").child(adminUID).child("pacientes").child(pacienteID).updateChildren(mapUsuario);


                    Map<String, Object> userLookUp = new HashMap<>();
                    userLookUp.put(pacienteID, adminUID);
                    mDatabase.child("Test").child("userLookup").updateChildren(userLookUp);


                    Toast.makeText(mContext, "Succefully added a new user", Toast.LENGTH_SHORT).show();
                    mDialog.dismiss();

                } else {

                    pd.dismiss();

                    Toast.makeText(mContext, "E-mail or password invalid",
                            Toast.LENGTH_SHORT).show();
                }

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

                Toast.makeText(mContext, "A problem has ocured: " + e.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });

西班牙语中有一些东西,这是我在回购中使用的旧版本,我相信它将为您提供帮助。

如您所见,userLookup是一个具有其当前UID的用户表,因此我可以将该特定用户ID与该表中的用户ID进行匹配,并获取所有用户信息。