Android Studio中如何验证本地旧密码与Firebase存储密码一致?
问题
我的Firebase Realtime Database存储每个用户的4项信息:name、email、password、confirm password,对应的实体类如下:
public class Users { String Username,Email,Password,ConfirmPassword; public Users() { } public Users(String username, String email, String password, String confirmPassword) { Username = username; Email = email; Password = password; ConfirmPassword = confirmPassword; } public String getUsername() { return Username; } public void setUsername(String username) { Username = username; } public String getEmail() { return Email; } public void setEmail(String email) { Email = email; } public String getPassword() { return Password; } public void setPassword(String password) { Password = password; } public String getConfirmPassword() { return ConfirmPassword; } public void setConformPassword(String conformPassword) { ConfirmPassword = conformPassword; } }
已存储的Firebase数据示例:
{ "user": { "user22": { "confirmPassword": "12345678", "email": "user22@gmail.com", "password": "12345678", "username": "user22" } } }
应用提供修改密码功能,用户需在EditText中输入旧密码和新密码,点击确认按钮后修改密码。但修改前需要验证输入的旧密码与Firebase中存储的密码是否一致,目前无法实现该验证逻辑。
尝试了以下代码,但无法正确获取目标变量,导致无论旧密码是否匹配,密码都会被修改:
public void showUserName() { FirebaseDatabase Data= FirebaseDatabase.getInstance(); DatabaseReference myRef=Data.getReference("user"); myRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { username.setText(snapshot.child("username").getValue(String.class)); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
解决方案
实现旧密码验证的核心是精准定位当前用户的数据库节点,取出存储密码与用户输入的旧密码对比,验证通过后再执行修改操作。
核心实现代码
将以下逻辑集成到修改密码按钮的点击事件中:
// 获取用户输入内容 String inputOldPwd = etOldPassword.getText().toString().trim(); String inputNewPwd = etNewPassword.getText().toString().trim(); String currentUsername = "user22"; // 替换为当前登录用户的实际用户名(可从SharedPreferences或Firebase Auth获取) // 定位目标用户节点 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference userRef = database.getReference("user").child(currentUsername); // 单次查询用户数据 userRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!snapshot.exists()) { Toast.makeText(getApplicationContext(), "用户不存在", Toast.LENGTH_SHORT).show(); return; } Users user = snapshot.getValue(Users.class); if (user == null) { Toast.makeText(getApplicationContext(), "用户数据解析失败", Toast.LENGTH_SHORT).show(); return; } // 对比旧密码 if (inputOldPwd.equals(user.getPassword())) { // 验证通过,更新密码 userRef.child("password").setValue(inputNewPwd); userRef.child("confirmPassword").setValue(inputNewPwd); Toast.makeText(getApplicationContext(), "密码修改成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "旧密码输入错误", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(getApplicationContext(), "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
关键细节说明
- 使用
addListenerForSingleValueEvent:仅执行一次数据查询,避免持续监听造成的资源浪费,适合一次性验证场景。 - 动态获取当前用户名:不要硬编码
user22,建议从用户登录状态中获取(如通过Firebase Auth的getCurrentUser()获取相关标识,或登录时将用户名存入SharedPreferences)。 - 安全提示:当前明文存储密码存在严重安全风险,建议存储前对密码进行哈希加密(如SHA-256),验证时对输入的旧密码执行相同哈希操作后再对比。
内容的提问来源于stack exchange,提问作者alon
相关产品推荐
相关产品推荐

