在我的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"
}
},
运行规则模拟器也可以。
答案 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进行匹配,并获取所有用户信息。