stackoverflow.com/questions/46435225/...

Разрешить пользователям разных типов входить в свои интерфейсы

Описание

Типы пользователей (3):

Ученик

родительучительКаждый пользователь зарегистрирован по электронной почте для аутентификации Firebase

Каждый пользователь должен иметь возможность доступа к своим соответствующим интерфейсам в качестве каждого интерфейса, если он отличается от других

Каждый пользователь уже был сохранен со своими соответствующими дочерними узлами в базе данных Firebase. Например, в разделе «Пользователи» есть «Школа», а под ними - такие типы пользователей, как «Ученик», «Родитель» и «Учитель».

База данных для визуализации

пользователей

-> Школа

------> Студент

------> Родитель

------> Учитель

проблема

Поскольку в настоящее время я использую электронную почту проверки подлинности Firebase, я не могу различить, какой пользователь какой.

Предлагаемое решение заключается в создании переключателя с 3 типами пользователей, которые пользователь может выбрать при входе в приложение. Это означает, что пользователь должен будет войти в систему, введя свой адрес электронной почты, пароль и выбрав тип пользователя.

Проблема заключается в том, что если пользователь «Студент» выберет «Родитель» или «Учитель» на радиокнопке и войдет в систему, используя электронную почту ученика, приложение все равно распознает письмо «Студент» как «Родитель» или «Родитель». Учитель»

LoginActivity Class

Мое предлагаемое решение (неполное)

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;
                        }
                    }
                });
    }
}

Я думал, что я должен жестко закодировать "UserCode" для каждого пользователя

Например, каждый пользователь вместе со своим соответствующим «кодом пользователя»

"Student" = "Student123"

"Родитель" = "Родитель123"

"Учитель" = "Учитель123"

Пример кода будет таким

UserCode будет EditText, который позволит пользователю ввести «userCode», хотя концепция этой идеи похожа на концепцию переключателя, она обеспечит большую безопасность, так как «userCode» действует как «вторичный» пароль в котором пользователи будут знать это только от меня (Admin). Дайте мне свои мысли

    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
}

>>>>>>>>>>>>>>>>>>>>>>>>>>> РЕШЕНИЕ <<<<<<<<<<<<<<<<<<<<<< <<<<<

Решение - Описание

После того, как пользователь

Заверенные через проверку подлинности электронной почты Firebase, оператор If else будет выполняться в функции «loginUser», которая будет определять, зарегистрирован ли пользователь, прошедший проверку подлинности, зарегистрирован как «ученик», «родитель» или «учитель».Запись

Во время регистрации зарегистрируйте переменную userType для пользователя. «UserType» будет храниться в дереве базы данных. Таким образом, вы сможете позвонить, чтобы проверить тип пользователя во время сеанса входа

Решение - Пример кода

Вы должны добавить еще 1

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) {

                                }
                            });
                        }
                    }
                });
    }

Ответы на вопрос(1)

Ваш ответ на вопрос