【问题标题】:How to undo a ParseUser.setPassword() call?如何撤消 ParseUser.setPassword() 调用?
【发布时间】:2015-06-13 22:31:36
【问题描述】:

我让用户更改他的凭据。 他输入新的用户名、电子邮件和密码,然后我会这样:

ParseUser user = ParseUser.getCurrentUser();
user.setUsername("MY NEW NAME");
user.setEmail(email);
user.setPassword("MY NEW PW");
user.saveInBackground(...);

那又怎样?所以这个save() 调用可能会失败,原因有很多(例如:用户名已被其他人占用)。我可以说,在这种情况下,上述字段都没有更新,这是公平的:我显示一个错误,用户知道一切都出错了。

如果您注意到即使在ParseException 之后,上面的user 仍保留其脏字段,则事情会变得复杂,这些字段无法保存到服务器。即

//saveInBackground fails
//...
user.getUsername().equals("MY NEW NAME") // true!

问题

现在,我可以通过调用 user.fetch() 将这些字段恢复为正确的值,但这不适用于 password 字段。

这是特别不需要的,因为将来对save() 或类似的任何调用(可能不会失败,因为它可能是一个完全不同的调用)也会更新密码!即

//later
ParseUser user = ParseUser.getCurrentUser();
user.put("stuff");
user.save();

这不仅会放入“东西”,而且还会将密码更改为“MY NEW PW”.. 用户不知道。

除了无效的fetch() 之外,还有什么方法可以重置本地password 字段?我知道我可以使用三个不同的查询保存用户名、电子邮件和密码,但这不是我的情况的可能解决方案。

【问题讨论】:

  • 试试这个:“撤消”不适用于 android-swipe-to-dismiss-undo setOnItemClickListener 对我不起作用。这是因为我在适配器中使用了 OnLongClickListener 和 setOnCheckedChangeListener?
  • ``` ParseUser user = ParseUser.getCurrentUser(); ParseUser oriUser = user.fetch(); // 返回一个 ParseUser 实例,这是你想要的吗? oriUser.setPassword.equals(""我的新密码""); // 对或错 ? ```
  • 但是我觉得这不是一个好办法,fetch() 会添加一次net access,正确的办法是在更新值之前自己bak in local
  • @aWang 我没有使用ParseUser user2 = user.fetch() 进行测试,我单独调用user.fetch() 然后查询ParseUser.getCurrentUser()。这是最常见的情况,因为稍后在应用程序中我需要调用ParseUser.getCurrentUser().save()。我希望 ParseUser.getCurrentUser() 恢复到以前的密码。

标签: android parse-platform


【解决方案1】:

一种解决方法可以使用

+ becomeInBackground:

保存失败时在 PFUser 类(使用 PFUser.currentUser().sessionToken 作为令牌)上,但这仍然是 becomeInBackground 失败的风险。 它至少可以防止某些情况发生 if becomeInBackground 有效地撤消 setPassword,并接受当前 sessionToken 作为参数,我还没有测试过

【讨论】:

    【解决方案2】:

    查看我在更新日志中看到的最新版本:

    V1.10.2 — 2015 年 9 月 15 日

    新增:添加 ParseObject.revert() 和 revert(key) 以允许还原 肮脏的变化

    看起来可能是这样。绝对需要。

    【讨论】:

      【解决方案3】:

      如果是我的问题,我会先尝试创建一个 oldUser 并将所有当前数据保存到其中,然后当失败时,是时候将所有内容恢复为正常值,或者如果成功,是时候杀死 oldUser .希望对您有所帮助。

      【讨论】:

      • 我希望得到框架提供的东西,但如果没有,这可能是一个很好的解决方法。感谢您指出。
      【解决方案4】:

      密码纯文本不存储在 Parse 中,因此您的应用无法获取它。在这里找到它https://www.parse.com/questions/get-current-users-password-to-compare-it-with-a-string

      如果您想更改密码,您可以使用ParseUser.requestPasswordResetInBackground(),这样您将在电子邮件的帮助下更改密码。

      但如果你真的需要密码,你可以在登录后将它存储在SharedPreferences中。

      【讨论】:

        【解决方案5】:

        经过一些测试和检查,这里有一些结论。

        1. 在解析中,“password”是一个特殊字段,ParseUser不能访问,也就是说ParseUser有setPassword()但没有getPassword()方法
        2. 即使在后台管理【核心】-【数据】-【用户】,也可以看到“密码”字段被隐藏
        3. 这就是为什么 fetch() 方法无法恢复原始“密码”值的原因

        所以,我想如果你需要上面的工具,试试这个方法

        // First time register //
        ParseUser user = ParseUser.getCurrentUser();
        user.setUsername("MY NAME");
        user.setEmail(email);
        user.setPassword("MY PW");
        user.put("_password", "MY PW");
        // The key can't use "password", this's reserve key word in Parse //
        user.saveInBackground(...);
        
        // Next time update //
        user.setUsername("MY NEW NAME");
        user.setPassword("MY NEW PW");
        user.saveInBackground(...);
        
        // if have something exception //
        user.fetch();
        // user.setPassword(user.get("_password"));
        user.save();
        ParseUser.login("MY NAME", "MY PW"); // Error
        ParseUser.login("MY NAME", "MY NEW PW"); // Ok
        
        user.fetch();
        user.setPassword(user.get("_password"));
        user.save();
        ParseUser.login("MY NAME", "MY PW"); // OK
        

        【讨论】:

          猜你喜欢
          • 2011-10-31
          • 2021-06-01
          • 2014-04-12
          • 1970-01-01
          • 1970-01-01
          • 2019-12-11
          • 2014-11-06
          • 1970-01-01
          • 2018-10-25
          相关资源
          最近更新 更多