Ziel
Zulassen, dass sich verschiedene Benutzertypen bei ihren jeweiligen Schnittstellen anmelden können
Beschreibung
Arten von Benutzern (3):
Jeder Benutzer wird über die Firebase-Authentifizierungs-E-Mail registriert
Jeder Benutzer sollte in der Lage sein, auf seine jeweiligen Schnittstellen als jede Schnittstelle zuzugreifen, wenn er sich voneinander unterscheidet
Jeder Benutzer wurde bereits mit seinen entsprechenden untergeordneten Knoten in der Firebase-Datenbank gespeichert. Zum Beispiel gibt es unter "Benutzer" eine "Schule" und darunter die Benutzertypen wie "Schüler", "Eltern" und "Lehrer".
Datenbank zur Visualisierung
-> Schule
------> Student
------> Elternteil
------> Lehrer
Problem
Da ich derzeit Firebase-Authentifizierungs-E-Mail verwende, kann ich nicht unterscheiden, welcher Benutzer welcher ist.
Eine vorgeschlagene Lösung, bei der ein Optionsfeld mit drei Benutzerarten erstellt wird, die der Benutzer auswählen kann, wenn er sich in der App anmeldet. Dies bedeutet, dass sich der Benutzer anmelden muss, indem er seine E-Mail-Adresse, das Kennwort und den Benutzertyp auswählt.
Das Problem dabei ist, dass, wenn der Benutzer "Student" unter "Radio" die Option "Eltern" oder "Lehrer" auswählt und sich mit einer Student-E-Mail anmeldet, die App die "Student"-E-Mail trotzdem als "Eltern" oder "erkennt". Lehrer"
LoginActivity-Klasse
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;
}
}
});
}
}
Meine vorgeschlagene Lösung (unvollständig)
Ich dachte, ich sollte "UserCode" für jeden Benutzer fest codieren
Zum Beispiel kann jeder Benutzer neben seinem jeweiligen "Usercode"
"Student" = "Student123"
"Parent" = "Parent123"
"Teacher" = "Teacher123"
Ein Codebeispiel wird so sein
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
}
Der UserCode ist ein EditText, der es dem Benutzer ermöglicht, den "UserCode" einzugeben, obwohl das Konzept dieser Idee dem des Radioknopfes ähnelt. Es bietet mehr Sicherheit, da der "UserCode" als "sekundäres" Kennwort fungiert in dem die Benutzer es nur von mir wissen werden (Admin). Gib mir deine Gedanken
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LÖSUNG <<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<
Lösung - Beschreibung
Nachdem der Benutzer Authenticated über die Firebase-E-Mail-Authentifizierung ist, wird in der Funktion "loginUser" eine If-else-Anweisung ausgeführt, die bestimmt, ob der authentifizierte Benutzer als "Student", "Parent" oder "Teacher" registriert wurde ".
Registrieren Sie während der Registrierung eine "userType" -Variable für den Benutzer. Der "userType" wird in der Datenbankstruktur gespeichert. Auf diese Weise können Sie es anrufen, um den Benutzertyp während der Anmeldesitzung zu überprüfen
Lösung - Beispielcode
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) {
}
});
}
}
});
}
Sie benötigen lediglich eine Möglichkeit, um zu überprüfen, ob der Benutzer ein Elternteil, Schüler oder Lehrer ist, wenn er sich zum ersten Mal für die App anmeldet. Danach fügen Sie eine 'Typ'-Variable in ihren Benutzerinformationsbereich der Firebase-Datenbank ein (Typ = Eltern, Schüler oder Lehrer). Wenn sie sich anmelden, rufen Sie ihren 'Typ' ab. Und zeigen Sie die richtige entsprechende Schnittstelle.
sie müssen noch 1 weitere parameter as a type
nehmen
In welchem wenn user's student login
ist es leicht differentiatable
in database
database table
erstellen