的Android - 火力地堡 - 不同类型的用户的登录

问题描述:

目的的Android - 火力地堡 - 不同类型的用户的登录

允许不同类型的用户登录到它们各自的接口

说明用户的

  • 类型(3) :

    1. 学生
    2. 教师
  • 每个用户经由火力地堡验证电子邮件注册

  • 每个用户应能够访问它们各自的接口,就好像不同的每个接口从其他

  • 每个用户已经在Firebase数据库中保存了各自的子节点。例如,在“用户”下面有一个“学校”,其下是“学生”,“家长”和“老师”等用户类型。

数据库用于可视化目的

  • 用户

- >学校

------>学生

------>父

------>教师

enter image description here

问题

由于我目前使用的火力地堡验证电子邮件,我无法分辨用户是在它们之间。

建议的解决方案是创建一个带有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<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> 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; 
         } 
        } 
       }); 
    } 
} 

我所提出的解决方案(不完全)

我在想,我应该^ h ardcode “用户代码” 为每个用户

例如,每个用户沿着它们各自的 “用户代码”

“学生”= “Student123”

“父”= “Parent123”

“教师“= ”Teacher123“

一个代码示例将是这样

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”,即使这个想法的概念类似于Radio Button的概念,它将提供更多的安全性,因为“userCode”充当“辅助”用户只能从我那里知道密码(管理员)。给我你的想法


>>>>>>>>>>>>>>>>>>>>>>>>>>> SOLUTION < < < < < < < < < < < < < < < < < < < < < < < < < < <

解决方案 - 说明

后用户通过身份验证通过火力地堡电子邮件验证,一个If else语句将在“loginUser”功能,这将决定是否通过认证的用户注册为内运行一个“学生”,“家长”或“老师”。

在注册过程中,注册该用户的 “用户类型” 变量。 “userType”将被存储在数据库树中。这样,你就可以把它叫做登录会话

解决方案中,以验证用户的类型 - 示例代码

private void loginUser(final String userLoginEmail, final String userLoginPassword) { 
     mAuthLogin.signInWithEmailAndPassword(userLoginEmail, userLoginPassword) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> 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) { 

           } 
          }); 
         } 
        } 
       }); 
    } 
+0

你必须在firebase数据库中添加1个'parameter'参数'type'。 –

+0

你的意思是 用户 - >类型 - >学生 - >父 - >老师 – Student

+0

可以发布你的'数据库结构' –

所有你需要的是一个方法来验证用户是家长,学生或老师在他们首次注册该应用程序时。之后,您在Firebase数据库的用户信息部分中输入“type”变量(type = Parent,student或teacher)。然后当他们登录时,你可以检索他们的'类型'。并显示正确的相应界面。

+0

这意味着我将不得不使用'jRegisterGuardDatabase = FirebaseDatabase.getInstance()。getReference()。child(“Users”)。child(userSchool).child(“Type”)。child(“Student”)。 child(RegisterUserID);'如果“registeredEmail”等于上面的代码,用户将被提示到相应的接口? – Student

  • 你需要采取1更多parameter as a type

  • 其中,如果user's student login它很容易differentiatabledatabase

  • 您需要创建database table根据您的需要

很高兴他lp you

+0

是的,你是对的!我编辑了我的问题,并包含了我的登录功能代码。谢谢= D – Student

+0

最受欢迎的兄弟 –

+0

嘿威沙尔,你能帮我回答我有的其他问题吗? https://*.com/questions/46435225/android-firebase-send-users-to-chat-room – Student