Android – Firebase – 不同类型的用户登录
目标
允许不同类型的用户登录其各自的界面
描述
-
用户类型(3):
- 学生
- 亲
- 老师
-
每个用户都通过Firebase身份validation电子邮件注册
-
如果每个接口与另一个接口不同,则每个用户应该能够访问其各自的接口
-
每个用户都已与Firebase数据库中的各自子节点一起保存。 例如,在“用户”下面有一个“学校”,其下是用户类型,如“学生”,“家长”和“老师”。
用于可视化目的的数据库
- 用户
– >学校
——>学生
——>父母
——>老师
问题
由于我目前正在使用Firebase身份validation电子邮件,因此我无法区分哪个用户是哪个。
建议的解决方案是创建具有3种类型用户的单选按钮,供用户在登录应用程序时进行选择。 这意味着用户必须通过输入他们的电子邮件,密码和选择他们的用户类型来登录。
问题是,如果“学生”用户在单选按钮上选择“父母”或“老师”并使用学生电子邮件登录,该应用程序仍会将“学生”电子邮件识别为“父母”或“老师”
LoginActivity类
import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseAuthException; public class LoginActivity extends AppCompatActivity { private Toolbar jLoginToolbar; private EditText jLoginEmail; private EditText jLoginPassword; private Button jLoginBtn; private Button jAdminLoginBtn; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mAuth = FirebaseAuth.getInstance(); jLoginToolbar = (Toolbar) findViewById(R.id.loginToolbar); setSupportActionBar(jLoginToolbar); getSupportActionBar().setTitle("Account Login"); getSupportActionBar().setDisplayHomeAsUpEnabled(true); jLoginEmail = (EditText) findViewById(R.id.loginEmail); jLoginPassword = (EditText) findViewById(R.id.loginPassword); jLoginBtn = (Button) findViewById(R.id.loginBtn); jAdminLoginBtn = (Button) findViewById(R.id.loginAdminBtn); jAdminLoginBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intentAdmin = new Intent(LoginActivity.this, AdminLoginActivity.class); startActivity(intentAdmin); } }); jLoginBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String userLoginEmail = jLoginEmail.getText().toString(); String userLoginPassword = jLoginPassword.getText().toString(); if(!TextUtils.isEmpty(userLoginEmail)&& !TextUtils.isEmpty(userLoginPassword)) { loginUser(userLoginEmail, userLoginPassword); }else{ Toast.makeText(LoginActivity.this, "Failed Login: Empty Inputs are not allowed", Toast.LENGTH_SHORT).show(); } } }); } private void loginUser(final String userLoginEmail, final String userLoginPassword) { mAuth.signInWithEmailAndPassword(userLoginEmail, userLoginPassword) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { Intent intentMain = new Intent(LoginActivity.this, MainActivity.class); intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intentMain); finish(); }else{ FirebaseAuthException e = (FirebaseAuthException )task.getException(); Toast.makeText(LoginActivity.this, "Failed Login: "+e.getMessage(), Toast.LENGTH_SHORT).show(); return; } } }); } }
我建议的解决方案(不完整)
我在想我应该为每个用户硬编码“UserCode”
例如,每个用户旁边各自的“用户代码”
“学生”=“学生123”
“父母”=“父母123”
“老师”=“老师123”
代码示例将是这样的
if(task.isSuccessful() && userCode.equals("Student123")){ //Send user to Student Interface }else if(task.isSuccessful() && userCode.equals("Parent123")){ //Send user to Parent Interface }else if(task.isSuccessful() && userCode.equals("Teacher123")){ //Send user to Teacher Interface }
UserCode将是一个EditText,允许用户输入“userCode”,即使这个想法的概念类似于单选按钮的概念,它将提供更多的安全性,因为“userCode”充当“辅助”密码用户只能从我这里知道(管理员)。 把你的想法告诉我
>>>>>>>>>>>>>>>>>>>>>>>>>>>解决方案<<<<<<<<<<<<<<<<<<<<<< <<<<<
解决方案 – 说明
用户通过Firebase电子邮件身份validation进行身份validation后,将在“loginUser”函数中运行If else语句,该函数将确定Authenticated用户是否已注册为“Student”,“Parent”或“Teacher”。
- 注意
在注册期间,为用户注册“userType”变量。 “userType”将存储在数据库树中。 这样,您就可以在登录会话期间调用它来validation用户的类型
解决方案 – 示例代码
private void loginUser(final String userLoginEmail, final String userLoginPassword) { mAuthLogin.signInWithEmailAndPassword(userLoginEmail, userLoginPassword) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if(task.isSuccessful()){ FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); String RegisteredUserID = currentUser.getUid(); jLoginDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(RegisteredUserID); jLoginDatabase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String userType = dataSnapshot.child("userType").getValue().toString(); if(userType.equals("Resident")){ Intent intentResident = new Intent(LoginActivity.this, ResidentActivity.class); intentResident.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intentResident); finish(); }else if(userType.equals("Guard")){ Intent intentMain = new Intent(LoginActivity.this, SecurityGuardActivity.class); intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intentMain); finish(); }else if(userType.equals("Police")){ Intent intentMain = new Intent(LoginActivity.this, PoliceActivity.class); intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intentMain); finish(); }else{ Toast.makeText(LoginActivity.this, "Failed Login. Please Try Again", Toast.LENGTH_SHORT).show(); return; } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } }); }
您只需要在首次注册应用时validation用户是家长,学生还是教师。 之后,您在Firebase数据库的用户信息部分(type = Parent,student或teacher)中添加了“type”变量。 然后,当他们登录时,您将检索他们的“类型”。 并显示正确的相应界面。
-
你需要再增加一个
parameter as a type
-
如果
user's student login
,则很容易在database
differentiatable
- 您需要根据需要创建
database table
很高兴为您服务
- Java Server – 使用POST发送Push到Google Firebase Cloud
- 无法从Android中的Firebase Storge获取下载URL
- 来自Java而不是Firebase控制台的Firebase Cloud Messaging通知
- 如何在RecyclerView项中的populateViewHolder中设置addSnapshotListener并删除?
- 在Custom Object Firebase Android中获取参考和密钥
- Firestore:允许拒绝权限的事务
- Firebase DatabaseException:无法将java.lang.Long类型的值转换为String
- 为什么我不能使用populateViewHolder覆盖方法?
- 我对托管Java Web应用程序有何不理解?