如何将多种类型的用户重定向到各自的活动?

Posted

技术标签:

【中文标题】如何将多种类型的用户重定向到各自的活动?【英文标题】:How to redirect multiple types of users to their respective Activities? 【发布时间】:2021-09-11 10:21:24 【问题描述】:

我正在 Firebase 上创建一个投票应用。我有 3 种类型的用户。到目前为止,我可以成功地将两种用户(学生、教师)重定向到他们各自的活动,他们使用下面的代码登录后,MY Users so far 但是现在我必须添加另一个用户(ADMIN),并且像其他用户一样,管理员也应该在登录后被重定向到他们自己的特定活动。我对如何为第三个用户修改我的代码感到困惑。

mAuthListener = new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(FirebaseAuth firebaseAuth) 
            FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            if (mAuth.getCurrentUser() != null) 

                String uid = mAuth.getInstance().getCurrentUser().getUid();
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                uidRef = rootRef.child("STUDENTS").child(uid);

                ValueEventListener valueEventListener = new ValueEventListener() 
                    @Override
                    public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) 
                        if (dataSnapshot.exists()) 
                            //start students activity
                            startActivity(new Intent(MainActivity.this, student.class));

                         else 
                            //start teachers activity
                            startActivity(new Intent(MainActivity.this, teacher.class));
                        
                    

                    //
                    @Override
                    public void onCancelled(DatabaseError databaseError) 
                    
                    
                ;


uidRef.addListenerForSingleValueEvent(valueEventListener);

            
            else
                Log.d("TAG", "firebaseUser is null");
            


        
    ;

【问题讨论】:

您是否尝试过以与学生和老师相同的方式做事? IF Else 条件非常适合学生和教师。我知道代码没问题,但不知道如何为第三个用户进一步修改它。感谢您回复亚历克斯。 你试过用switch语句吗? 它的具体条件是什么?你能解释一下吗? 问题解决了吗? 【参考方案1】:

仅使用if (dataSnapshot.exists()) 不会解决您的 3 类用户问题。假设第三个用户的类型是3,则需要更改您的数据库结构。因此,您的新数据库架构应如下所示:

Firebase-root
    |
    --- users
          |
          --- uidOne
          |     |
          |     --- name: "Ed"
          |     |
          |     --- type: 1
          |
          --- uidTwo
          |     |
          |     --- name: "Tyff"
          |     |
          |     --- type: 2
          |
          --- uidOne
                |
                --- name: "Admin"
                |
                --- type: 3

现在你应该在uid 节点上添加一个监听器并像这样检查用户的类型:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        if(dataSnapshot.child("Type").getValue(Long.class) == 1) 
            startActivity(new Intent(MainActivity.this, student.class));
         else if (dataSnapshot.child("TYPE").getValue(Long.class) == 2) 
            startActivity(new Intent(MainActivity.this, teacher.class));
         else if (dataSnapshot.child("TYPE").getValue(Long.class) == 3) 
            startActivity(new Intent(MainActivity.this, admin.class));
        
    

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) 
        Log.d(TAG, databaseError.getMessage());
    
;
uidRef.addListenerForSingleValueEvent(valueEventListener);

【讨论】:

感谢您的回答。我会尽快试用。 好的,让我知道。 亚历克斯,对不起。由于繁忙的日程和一些个人责任,我什至无法打开我的笔记本电脑。但是这个周末我完全有空,我计划做的第一件事就是编写你写的代码。谢谢你。照顾好自己。 if(dataSnapshot.child("TYPE") == 1) 处的错误。它说“运算符 == 不能应用于 int”。我尝试转换为长字符串。然后它说“运算符 == 不能应用于 java.lang.string” 亚历克斯,亚历克斯,亚历克斯,你是救生员。字面上地。我对代码做了一些小改动,现在一切正常。更好的是,现在我可以根据需要添加任意类型的用户。都感谢你。谢谢你在那里。这么多。【参考方案2】:

您需要另一个数据结构,usersroles/adminroles/teacherroles/student,然后检查哪个节点拥有密钥(也与安全规则兼容)。

如您所愿,您可以简单地删除 else 分支并查询所有三个节点。

【讨论】:

【参考方案3】:

这是我使用 Kotlin 的最终代码,它运行良好。

mAuth.signInWithEmailAndPassword(Email, Password).addOnCompleteListener  task ->
                if (task.isSuccessful) 



                    val uid = FirebaseAuth.getInstance().currentUser!!.uid
                    val rootRef = FirebaseDatabase.getInstance().reference
                    val uidRef = rootRef.child("Users").child(uid)
                    val spin: String = userchioce.selectedItem.toString()
                val valueEventListener: ValueEventListener = object : ValueEventListener 
                    override fun onDataChange(dataSnapshot: DataSnapshot) 
                        when 
                                dataSnapshot.child("users").getValue(String::class.java) == "Admin" -> 
                                    if (spin.equals("Admin"))
                                val intent = Intent(this@Login, Admin::class.java)
                                startActivity(intent)
                                    else
                                        Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                            .show()
                                    
                            

                            dataSnapshot.child("users").getValue(String::class.java) == "Lecturer" -> 
                                if (spin.equals("Lecturer")) 
                                    val intent = Intent(this@Login, Lecturer::class.java)
                                    startActivity(intent)
                                else
                                    Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                        .show()
                                
                            
                            dataSnapshot.child("users").getValue(String::class.java) == "Parent" -> 
                                if (spin.equals("Parent")) 
                                    val intent = Intent(this@Login, Parent::class.java)
                                    startActivity(intent)
                                else
                                    Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                        .show()
                                
                            
                            dataSnapshot.child("users").getValue(String::class.java) == "Student" -> 
                                if (spin.equals("Student")) 
                                    val intent = Intent(this@Login, Student::class.java)
                                    startActivity(intent)
                                else
                                    Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
                                        .show()
                                
                            
                        
                    

                    override fun onCancelled(databaseError: DatabaseError) 
                        Log.d(TAG, databaseError.message)
                    
                
                uidRef.addListenerForSingleValueEvent(valueEventListener)
                    progressDialog.dismiss()
                

【讨论】:

以上是关于如何将多种类型的用户重定向到各自的活动?的主要内容,如果未能解决你的问题,请参考以下文章

在空闲/不活动60秒后重定向用户?

不活动后重定向用户,但保持会话活动

如何在nginx创建临时重定向和永久重定向

如何根据用户类型重定向到特定的布局页面?

当用户会话处于活动状态时使用 Laravel 5.7 中的 Auth 重定向到页面的方法

如何使用js 重定向到原来的页面