Android用户会话和SharedPreferences

时间:2015-07-31 15:23:56

标签: android sharedpreferences

我目前正在开发一个在Web服务中获取信息的Android应用程序。这些信息与用户(具有数字用户ID)有关。

基本上,我对像这样的URL做了Volley请求: http://api.mydomain/user/items带有POST参数,这是我想要检索项目的用户ID。 当用户首次登录我的应用程序时,我实际上将他的用户ID存储在共享首选项中。这对两件事很有用:

  • 我可以从我的应用程序中的任何位置访问他的ID,因此使用当前用户ID执行Volley请求。
  • 我也在应用程序Splashscreen上使用它(我检查共享首选项文件中是否有这个值,如果是这样,他不必再次登录,并且他被重定向到应用程序主要活动)。 / LI>

当用户断开与应用程序的连接时,我会清除共享首选项文件,因此他必须在下次打开应用程序时再次登录。

所以这是我的问题:

  • 如果有根用户打开共享首选项文件,他将能够更改用户ID,以及他的身份。
  • 如果我保持此操作模式,我无法存储用户设置首选项(启用通知等),这是共享首选项文件的目的(我相信),因为我在用户断开连接时清除它为了让他下次再次登录。

所以,正如你可能认为的那样,我觉得这不是正确的做法..

做我想做的最好的实践是什么?

  • 保留某种"会话",以避免用户每次启动应用时都必须重新连接。
  • 以安全的方式存储用户ID,以防止恶意用户更改用户ID。

有没有办法加密那些关键数据?也许我不应该使用数字ID,而是使用某种加密密钥,以使其更难更改? SharedPreferences是否真的用于存储用户的设置(我是否应该将其存储在数据库中?)

提前感谢您帮助我,并抱歉英语不好。

1 个答案:

答案 0 :(得分:0)

SharePreferences用于存储此类信息。我将Auth令牌存储在我的一个应用程序的sharedPref中。是的,如果用户植根了手机,则共享首选项xml可以直接访问,但用户必须注意这一点(因为通常不建议使用root,如果root用户不将手机移交给程序员!)

来到您的方案,您正在删除应用关闭(断开连接)上的共享首选项。看起来您只是在一个应用程序生命周期中使用共享首选项而不是整个生命周期(从安装到卸载)。在这里使用 singleton 类可以更好。 Singleton类在每个生命周期中都有一个实例,你可以设置userId并从applifecycle中的任何地方获取它! :

Class mySingletonClass{

private String userID;
privat static mySingletonClass instance;

public static getInstance()
{

if(instance==null)  instance = new mySingletonClass();

return instance;

}


//getter setter for userID

}

设置UserID:

 mySingletonClass.getInstance().setUserID(String);

到ger UserID:

  mySngletonClass.getInstance().getUserID();

现在即使手机已植根,userID也安全地驻留在堆内存中!

如果您确实希望在整个应用程序生命周期中使用SharedPreference(安装到卸载)并且担心手机被root并且userId被盗,您可以在存储之前对ID进行模糊处理,但是您需要再次将密钥存储在共享中偏好也会使目的失败。另一种方法是将密钥存储在服务器上。克拉克仍然可以窥探网络电话并访问密钥,但这是一个很长的过程。