创建 Firebase 登录并且不要更改 FirebaseAuth [重复]
Posted
技术标签:
【中文标题】创建 Firebase 登录并且不要更改 FirebaseAuth [重复]【英文标题】:Create Firebase Login and dont change FirebaseAuth [duplicate] 【发布时间】:2019-11-17 08:14:56 【问题描述】:在我的 android 应用程序中,有 2 种类型的帐户(管理员和用户)。管理员可以创建用户帐户。问题是,在我从管理员创建用户帐户后,FirebaseAuth 更改为我不想要的新用户。
用例是: 管理员创建一个用户帐户。用户稍后会从他自己的设备登录。 (admin和User都属于同一个公司,为了方便我选择了这种方式)
那么有没有办法在firebase中创建一个帐户并且FirebaseAuth没有改变?
谢谢。
我尝试在创建 Uesr 帐户后重新登录管理员,但与此同时,由于安全规则,所有侦听器都被解雇 (onCancelled())。所以这种方法行不通
【问题讨论】:
"***.com/questions/54648880/…" 见***.com/questions/37517208/… 但是您为什么要管理员来创建新用户的帐户?为什么不让他们将新用户的电子邮件地址(或其他识别属性)作为白名单用户添加到数据库中?然后,当用户登录时,您会根据他们已登录并且被管理员列入白名单,授予他们访问应用数据的权限。 为了简单起见,我选择了这种方法。我的最终用户(非管理员)不精通技术并且通常是文盲,并且只需要输入一些数字,因此管理员通过设置他们的帐户来简化他们的帐户创建。您的想法提供了另一种方法。我会试试的。 如果您坚持当前的方法,链接的问题将显示如何在不退出当前用户的情况下创建新帐户。如果这对您不起作用,请展示您的尝试,以便我们尝试帮助解决问题。 成功了!但是注册完成后又遇到了另一个问题。我已经更新了问题。 【参考方案1】:前段时间,我在为客户实施一项功能时遇到了同样的问题。
我是如何解决的。
只需将管理员 UID 存储到共享首选项中,因此,每次我在管理员中创建一个新用户时,我都会为该用户分配创建它的管理员的 UID。
另外,如果您使用其他管理员登录,只需使用登录的当前管理员 uid 覆盖 sharedprefs 中的当前 UID。
这样做您可以继续创建用户并将其存储到管理员 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 匹配并获取所有用户信息。
【讨论】:
在您执行 mAuth.createUserWithEmailAndPassword(email, password) 之后,FirebaseAuth.getInstance() 将更改为新创建的用户,并且您的代码中的所有 firebase 挂钩都将触发并且 Permission Denied 错误将作为新的用户对管理员拥有的数据没有任何权利。这正是我的问题以上是关于创建 Firebase 登录并且不要更改 FirebaseAuth [重复]的主要内容,如果未能解决你的问题,请参考以下文章
让用户使用 Firebase 登录(自定义 iOS 身份验证)
Flutter:Fire Base 存储图像上传的后期初始化错误
Firebase 停止监听 onAuthStateChanged
如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular