You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

邮箱验证后如何不使用usertype字段实现学生、教师账号分别登录

Firebase Auth 无usertype字段身份判定登录实现方案

实现逻辑

原方案通过读取usertype字段区分身份,调整后逻辑为:

  • 登录校验通过且邮箱验证完成后,获取当前登录用户的UID
  • 分别校验该UID是否存在于USER节点下的Student/Teacher分支,根据存在的分支判定用户身份,跳转对应页面
  • 实时数据库结构参考:
    我的实时数据库结构

修改后的核心代码

你只需要替换原userLogin方法中邮箱验证通过后的逻辑即可,完整修改后的代码如下:

public class Login extends AppCompatActivity implements View.OnClickListener {

    private TextView signUp;
    private Button login;
    private TextInputEditText email, password;


    private FirebaseAuth mAuth;
    private ProgressBar progressBar;

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

        signUp = findViewById(R.id.signup);
        signUp.setOnClickListener(this);

        login = findViewById(R.id.btnLogin);
        login.setOnClickListener(this);

        email = findViewById(R.id.email_input_login);
        password = findViewById(R.id.password_input_login);

        progressBar = findViewById(R.id.progressBar);

        mAuth = FirebaseAuth.getInstance();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.signup:
                startActivity(new Intent(this, Signup.class));
                break;
            case R.id.btnLogin:
                userLogin();
                break;
        }
    }

    private void userLogin() {
        String Email = email.getText().toString().trim();
        String Password = password.getText().toString().trim();

        if (Email.isEmpty()){
            email.setError("Email is required!");
            email.requestFocus();
            return;

        }
        if (!Patterns.EMAIL_ADDRESS.matcher(Email).matches()){

            email.setError("Please enter a valid email!");
            email.requestFocus();
            return;
        }
        if(Password.isEmpty()){
            password.setError("Password is required!");
            password.requestFocus();
            return;
        }
        if (Password.length() < 6){
            password.setError("Min password length is 6 characters!");
            password.requestFocus();
            return;

        }

        progressBar.setVisibility(View.VISIBLE);

        mAuth.signInWithEmailAndPassword(Email,Password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                progressBar.setVisibility(View.INVISIBLE);
                if (task.isSuccessful()){

                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                    if(user.isEmailVerified()) {
                        String uid = task.getResult().getUser().getUid();
                        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
                        // 先判断是否为学生身份
                        firebaseDatabase.getReference("USER").child("Student").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                if(snapshot.exists()){
                                    // 是学生,跳学生对应页面
                                    startActivity(new Intent(Login.this, Example.class));
                                }else{
                                    // 不是学生,判断是否为教师
                                    firebaseDatabase.getReference("USER").child("Teacher").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                                            if(snapshot.exists()){
                                                // 是教师,跳教师对应页面
                                                startActivity(new Intent(Login.this, MainActivity.class));
                                            }
                                        }

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

                                        }
                                    });
                                }
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {
                            }
                        });

                    }
                    else{
                        user.sendEmailVerification();
                        Toast.makeText(Login.this, "Check your email to verify your account!", Toast.LENGTH_SHORT).show();
                    }

                }else{
                    Toast.makeText(Login.this, "Failed to Login! Please check your credentials", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
}

注意事项

  • 需确保你的实时数据库规则允许读取USER/Student和USER/Teacher节点的权限,否则会读取失败
  • 若学生和教师页面跳转对应关系和示例不一致,自行调整Intent跳转的目标Activity即可

内容的提问来源于stack exchange,提问作者red daemon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:27:01