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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:43:20