繁体   English   中英

识别两个地址相同的email用户

[英]Identify two users with the same email address

我目前正在开发一个家长控制应用程序,我想实现的是父母和孩子可以在不同的设备上使用相同的 email 地址登录系统,我还想实现自动登录功能,当父母打开app,会直接加载ParentActivity,如果是child则加载ChildActivity。

但现在的问题是我不能这样做,我不知道如何识别它们,因为它们使用相同的 email 地址。 以前,我可以使用 FirebaseAuth.getCurrentUser() 为父级执行自动登录,然后检查 firestore 中的用户类型。 但是现在我无法检查任何东西来识别用户是孩子还是父母。

我试过的:

  1. 创建一个名为“child”的字段,当用户(John)以孩子身份登录时,将字段更新为“TRUE”(假设),当 John 退出应用程序并再次登录时,系统将开始检查 userType ==“parents” ,如果没有那么它只会检查孩子是否==“TRUE”。 因此,子用户将始终自动登录到 ParentActivity 而不是 ChildActivity。

有什么办法可以做到这一点? 希望你们明白我的问题是什么。 附图显示了我之前是如何实现家长自动登录的。 提前致谢!

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    // Transparent Status Bar
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

    ButterKnife.bind(this);

    //FirebaseApp.initializeApp(this.getBaseContext());
    firebaseAuth = FirebaseAuth.getInstance();
    clearUserType();
}

// Hide keyboard after user clicking somewhere
public boolean onTouchEvent(MotionEvent event) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.
            INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    return true;
}

@OnClick(R.id.LoginButton)
public void login(){
    progressBar.setVisibility(View.VISIBLE);
    if (!Utils.isValidEmail(email, emailLayout) | !Utils.hasEmail(email, emailLayout) | !Utils.hasPassword(password, passwordLayout)){
        progressBar.setVisibility(View.INVISIBLE);
        return;
    }
    startSignIn(email.getText().toString(), password.getText().toString());
}

@OnClick(R.id.SignUpButton)
public void signUpScreen(){
    Intent signup = new Intent(this, SignUpActivity.class);
    startActivity(signup);
    finish();
}

@OnTextChanged(value = R.id.LoginEmailText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
public void emailChanged(CharSequence s){
    if(!(s.length() < 1)){
        emailLayout.setError(null);
    }
}

@OnTextChanged(value = R.id.LoginPasswordText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
public void passwordChanged(CharSequence s){
    if(!(s.length() < 1)){
        passwordLayout.setError(null);
    }
}

private void startSignIn(String email, String password){
    firebaseAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(task -> {
                try {
                    if (task.isSuccessful()) {
                        updateUI();
                    }
                    else {
                        String error = task.getException().getMessage();
                        if (error.contains("There is no user record corresponding to this identifier. The user may have been deleted.") ||
                            error.contains("The password is invalid or the user does not have a password."))
                        {
                            Utils.ErrorSweetDialog(LoginActivity.this, "Login Failed", "Incorrect email or pasword. Please try again.",
                                    "OK");
                        }
                        else if (error.contains("A network error (such as timeout, interrupted connection or unreachable host) has occurred.")){
                            Utils.ErrorSweetDialog(LoginActivity.this, "No Internet Connection",
                                    "Please check your internet connection and try again.", "OK");
                        }
                        else
                        {
                            Utils.ErrorSweetDialog(LoginActivity.this, "Login Failed", error, "OK");
                        }
                    }
                    progressBar.setVisibility(View.INVISIBLE);
                }
                catch (Exception e){
                    Utils.ErrorSweetDialog(LoginActivity.this, "Oops! Something went wrong.",
                            "Sorry for the inconvenience. Please try again later.", "OK");
                }
            });
}

@Override
protected void onStart() {
    super.onStart();
    //clearUserType();
    //FirebaseUser user = firebaseAuth.getCurrentUser();
    /*DocumentReference docRef = db.collection("UserInfo").document(uid); //ZJkUy7J5UzTok7ioADAYqk77Opp1
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if(task.isSuccessful()){
                DocumentSnapshot document = task.getResult();
                if(document.exists()){
                    String userType = document.getString("userType");
                    Log.e("LoginActivity",userType);
                }
            }
            else{

            }
        }
    });*/

    /*if(user != null){
        //updateUI();
        String uid = firebaseAuth.getCurrentUser().getUid();
        DocumentReference docRef = db.collection("UserInfo").document(uid); //ZJkUy7J5UzTok7ioADAYqk77Opp1
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()){
                    DocumentSnapshot document = task.getResult();
                    if(document.exists()){
                        String userType = document.getString("userType");
                        Log.e("LoginActivity",userType);
                        if (userType.contains("parents")){
                            Log.e("contain parents", "yes");
                            Intent intent = new Intent(getApplicationContext(), ParentActivity.class);
                            startActivity(intent);
                            finish();
                        }
                        else{

                        }
                    }
                }
                else{

                }
            }
        });
        Intent intent = new Intent(this, ParentActivity.class);
        startActivity(intent);
        finish();
    }
    else{
        Log.e("Login", "hi");
    }*/
}

private void updateUI(){
    Intent intent = new Intent(this, PickRoleActivity.class);
    startActivity(intent);
    finish();
}

private void clearUserType(){
    FirebaseUser user = firebaseAuth.getCurrentUser();
    //Log.e("urrent user", user.toString());
    if(user != null){
        progressBar.setVisibility(View.VISIBLE);
        Log.e("user null: ", "no");
        //updateUI();
        String uid = firebaseAuth.getCurrentUser().getUid();
        Log.e("UID: ",uid);
        DocumentReference docRef = db.collection("UserInfo").document(uid); //ZJkUy7J5UzTok7ioADAYqk77Opp1
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()){
                    DocumentSnapshot document = task.getResult();
                    if(document.exists()){
                        String userType = document.getString("userType");
                        String childStatus = document.getString("child");
                        Log.e("LoginActivity",userType);
                        if (userType.contains("parents")){
                            Log.e("contain parents", "yes");
                            progressBar.setVisibility(View.INVISIBLE);
                            Intent intent = new Intent(getApplicationContext(), ParentActivity.class);
                            startActivity(intent);
                            finish();
                        }
                        else if (childStatus.contains("TRUE")){
                            progressBar.setVisibility(View.INVISIBLE);
                        }
                    }
                }
                else{
                    Log.e("task unsuccessful:", " yes");
                }
            }
        });
    }
    else{
        Log.e("NULL: ", "No Such User.");
    }
}

}

Firestore 中的用户帐户数据

我假设您正在使用相同的 email 地址创建多个帐户,这意味着父母和孩子有不同的密码。 有了这个,我建议你看看Custom Claims 它基本上为帐户提供了一个可以访问客户端的“标签”。 请注意,这将要求您在创建帐户时编写一些 Cloud Functions

编辑:您似乎需要一个 SharedPreferences。 以下是文档:developer.android.com/training/data-storage/shared-preferences。 通过这种方式,您可以在 SharedPreferences 中存储isParent:true类的键,并在每次启动应用程序时读取其值,而不是将其保存到 Firestore。

您可以在登录活动的onCreate检查它们,或者如果您有 Splash 活动,您可以在那里检查。

   DocumentReference docRef = db.collection("UserInfo").document(uid); //ZJkUy7J5UzTok7ioADAYqk77Opp1
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if(task.isSuccessful()){
                DocumentSnapshot document = task.getResult();
                if(document.exists()){
                    String userType = document.getString("userType");
                    Log.e("LoginActivity",userType);
                    if (userType.equal("parents")){
                        Log.e("contain parents", "yes");
                        Intent intent = new Intent(getApplicationContext(), ParentActivity.class);
                        startActivity(intent);
                        finish();
                    }
                    else if (userType.equal("child")) {
                        //Here you missed, when child login
                    }
                }
            }

        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM