【问题标题】:validate user using firebase auth使用 firebase auth 验证用户
【发布时间】:2020-04-06 17:27:30
【问题描述】:

我希望在用户应用中注册的用户无法登录到管理员或医生应用。
或者在医生应用中注册的医生无法登录用户或管理员应用。
或者已经在管理应用程序中注册的管理员无法登录医生或用户应用程序。

我尝试的用户验证方法是

private void updateUI(final FirebaseUser user) {
    if (user!=null){

        final DatabaseReference adminsRef = FirebaseDatabase.getInstance().getReference().child("Admins").child(user.getUid());
        final DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(user.getUid());
        adminsRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){

                    userRole = dataSnapshot.child("role").getValue(String.class);
                    if (user.equals("admin")){
                        FancyToast.makeText(getApplicationContext(),"User already registered as an Admin",FancyToast.LENGTH_LONG,FancyToast.INFO,false).show();
                        FirebaseAuth.getInstance().signOut();
                        if (AccessToken.getCurrentAccessToken() != null) {
                            LoginManager.getInstance().logOut();
                        }
                        startActivity(new Intent(MainActivity.this,MainActivity.class));
                        finish();
                    }
                    else {
                        FirebaseDatabase database = FirebaseDatabase.getInstance();
                        DatabaseReference userRef = database.getReference("Doctors").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("uid", FirebaseAuth.getInstance().getCurrentUser().getUid());
                        map.put("email", FirebaseAuth.getInstance().getCurrentUser().getEmail());
                        map.put("name", FirebaseAuth.getInstance().getCurrentUser().getDisplayName());
                        map.put("profile_status","incomplete");
                        map.put("role","doctor");
                        //map.put("location", getIntent().getExtras().get("location").toString());
                        userRef.updateChildren(map).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    FancyToast.makeText(getApplicationContext(), "User details updated successfully", FancyToast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
                                } else {
                                    FancyToast.makeText(getApplicationContext(), "User details update unsuccessful", FancyToast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
                                }
                            }
                        });
                        Intent intent = new Intent(MainActivity.this, HomeActivity.class);
                        startActivity(intent);
                        finish();
                    }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        usersRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){
                    userRole = dataSnapshot.child("role").getValue(String.class);
                    if (userRole.equals("user")){
                        FancyToast.makeText(getApplicationContext(),"User already registered as a Customer",FancyToast.LENGTH_LONG,FancyToast.INFO,false).show();
                        FirebaseAuth.getInstance().signOut();
                        if (AccessToken.getCurrentAccessToken() != null) {
                            LoginManager.getInstance().logOut();
                        }
                        startActivity(new Intent(MainActivity.this,MainActivity.class));
                        finish();
                    }
                    else {
                        FirebaseDatabase database = FirebaseDatabase.getInstance();
                        DatabaseReference userRef = database.getReference("Doctors").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("uid", FirebaseAuth.getInstance().getCurrentUser().getUid());
                        map.put("email", FirebaseAuth.getInstance().getCurrentUser().getEmail());
                        map.put("name", FirebaseAuth.getInstance().getCurrentUser().getDisplayName());
                        map.put("profile_status","incomplete");
                        map.put("role","doctor");
                        //map.put("location", getIntent().getExtras().get("location").toString());
                        userRef.updateChildren(map).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    FancyToast.makeText(getApplicationContext(), "User details updated successfully", FancyToast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
                                } else {
                                    FancyToast.makeText(getApplicationContext(), "User details update unsuccessful", FancyToast.LENGTH_LONG, FancyToast.SUCCESS, true).show();
                                }
                            }
                        });
                        Intent intent = new Intent(MainActivity.this, HomeActivity.class);
                        startActivity(intent);
                        finish();
                    }

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });



    }

}

【问题讨论】:

    标签: java android firebase-realtime-database firebase-authentication


    【解决方案1】:

    您正在做几乎需要做的事情。 只需使用数据快照检查用户 UID 是否存在于用户子节点或管理子节点中。

    以下是获取用户角色的方法:

    String userRole;
    
    roleRef = FirebaseDatabase.getInstance().getReference().child("Users").child(firebaseAuth.getCurrentUser().getUid());
            roleRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                    try {
                        userRole = dataSnapshot.child("role").getValue().toString();
                        userProf_username.setText(userNameInData);
                    }catch (Throwable e){
                        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
                    }
    
                }
    

    现在用户的角色在字符串 userRole 中。所以现在你可以检查用户是管理员还是普通客户端。

    然后添加一个 if-else 块:

    if(userRole.equals("admin")){
    startActivity(new Intent(MainActivity.this, adminActivity.class);
    }
    else{
    startActivity(new Intent(MainActivity.this, userActivity.class);
    }
    

    【讨论】:

    • 什么是用户角色?
    • @KunalShah userRole 是您从数据库中获取的内容。它是一个字符串,其中包含用户角色,无论他是客户还是管理员
    • 你能提供完整的代码吗......因为我没有得到你
    • @KunalShah 我正在输入代码。直到时间,请在您的代码中添加它。您需要添加用户角色。用户在注册期间将成为什么。请在 UID 中添加一个新孩子以及姓名、位置、电子邮件和 uid。请问你能做到吗?
    • @KunalShah 这是我希望你做的。在您的用户注册时创建一个具有此类角色的孩子[当您上传其他孩子,如电子邮件和位置时]。看到这个screenshot 然后使用我的代码就可以了..
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 2018-06-04
    • 2018-05-22
    • 2018-12-29
    • 1970-01-01
    • 2021-02-15
    • 2020-01-02
    • 2018-02-24
    相关资源
    最近更新 更多