的Android - 火力地堡 - 不同类型的用户的登录
目的的Android - 火力地堡 - 不同类型的用户的登录
允许不同类型的用户登录到它们各自的接口
说明用户的
-
类型(3) :
- 学生
- 父
- 教师
每个用户经由火力地堡验证电子邮件注册
每个用户应能够访问它们各自的接口,就好像不同的每个接口从其他
每个用户已经在Firebase数据库中保存了各自的子节点。例如,在“用户”下面有一个“学校”,其下是“学生”,“家长”和“老师”等用户类型。
数据库用于可视化目的
- 用户
- >学校
------>学生
------>父
------>教师
问题
由于我目前使用的火力地堡验证电子邮件,我无法分辨用户是在它们之间。
建议的解决方案是创建一个带有3种类型用户的单选按钮,供用户在登录到应用程序时进行选择。这意味着用户必须输入他们的电子邮件,密码并选择他们的用户类型才能登录。
问题是,如果“学生”用户在单选按钮上选择“家长”或“教师”并使用学生电子邮件登录,该应用仍会将“学生”电子邮件识别为“家长”或 “老师”
LoginActivity类
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;
}
}
});
}
}
我所提出的解决方案(不完全)
我在想,我应该^ h ardcode “用户代码” 为每个用户
例如,每个用户沿着它们各自的 “用户代码”
“学生”= “Student123”
“父”= “Parent123”
“教师“= ”Teacher123“
一个代码示例将是这样
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
}
UserCode将是一个EditText,它允许用户输入“userCode”,即使这个想法的概念类似于Radio Button的概念,它将提供更多的安全性,因为“userCode”充当“辅助”用户只能从我那里知道密码(管理员)。给我你的想法
>>>>>>>>>>>>>>>>>>>>>>>>>>> SOLUTION < < < < < < < < < < < < < < < < < < < < < < < < < < <
解决方案 - 说明
后用户通过身份验证通过火力地堡电子邮件验证,一个If else语句将在“loginUser”功能,这将决定是否通过认证的用户注册为内运行一个“学生”,“家长”或“老师”。
- 注
在注册过程中,注册该用户的 “用户类型” 变量。 “userType”将被存储在数据库树中。这样,你就可以把它叫做登录会话
解决方案中,以验证用户的类型 - 示例代码
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) {
}
});
}
}
});
}
所有你需要的是一个方法来验证用户是家长,学生或老师在他们首次注册该应用程序时。之后,您在Firebase数据库的用户信息部分中输入“type”变量(type = Parent,student或teacher)。然后当他们登录时,你可以检索他们的'类型'。并显示正确的相应界面。
这意味着我将不得不使用'jRegisterGuardDatabase = FirebaseDatabase.getInstance()。getReference()。child(“Users”)。child(userSchool).child(“Type”)。child(“Student”)。 child(RegisterUserID);'如果“registeredEmail”等于上面的代码,用户将被提示到相应的接口? – Student
你必须在firebase数据库中添加1个'parameter'参数'type'。 –
你的意思是 用户 - >类型 - >学生 - >父 - >老师 – Student
可以发布你的'数据库结构' –