【问题标题】:GWT Authentication and user info accessGWT 身份验证和用户信息访问
【发布时间】:2013-09-28 02:34:23
【问题描述】:

只是想知道我的以下身份验证方法是否正确。是否有任何陷阱或缺少​​什么?非常欢迎提出建议和讨论。

1> 用户提供用户名和密码,通过RPC发送到服务器。与存储在 DB 中的哈希值进行比较。

2> 假设用户名和密码正确,则在会话中保存一个 Auth Token。访问 servlet 时将检查身份验证令牌。

3> 用户id(整数)通过RPC onSuccess返回给客户端。用户 ID 保存在客户端的静态变量中。

4> 每当需要用户特定信息时,带有用户 ID(静态变量)的 rpc 调用将被发送到服务器进行数据库查询。

谢谢

【问题讨论】:

标签: java gwt


【解决方案1】:

您最好将token返回客户端,并验证token而不是用户id。 如果使用了user id,用户A已经登录,那么另一个用户可以冒充用户A向服务器发送请求。您的身份验证方法未能保护数据。

【讨论】:

  • 然后servlet会检查session和session中的token来验证数据访问。
【解决方案2】:

您无需向客户端发送用户 ID。服务器已经拥有识别用户所需的所有信息。

这段代码 sn-p 创建了一个会话 cookie,使用session.getId() 你可以得到它的内容,你应该保存它来识别用户:

HttpServletRequest request = this.getThreadLocalRequest();
HttpSession session = request.getSession(true);

然后当用户调用你的服务器时,你只需读回会话 id。

HttpServletRequest request = this.getThreadLocalRequest();
HttpSession session = request.getSession(false);

使用session.invalidate()可以销毁会话,也可以在会话中使用store objects

this.getThreadLocalRequest() 仅适用于 *Impl 。

【讨论】:

  • 是的,你是对的。您可以通过这种方式识别会话。但是,我有一个关于访问 mysql 中的数据的问题。所有数据都有一列作为用户 ID。我需要通过这个用户id查询相关数据。如何将会话 ID 与用户 ID 关联起来?
  • 您可以将会话 ID 映射到新表中的用户 ID。这也将保持会话 ID 和用户 ID 分开。此外,如果一个用户的用户 ID 始终相同,我不建议将其存储在会话中。
  • 是的,这是一个更好的主意。所以建立一个新表来关联 sessionId(变量)和用户 id(常量)。但是,将 userId 保留为客户端的静态变量是否有任何陷阱,因为在访问 servlet 时将再次检查会话?
  • 当用户 ID 存储在客户端时,您期望有什么优势?此外,如果用户按下 f5 ,静态变量将被重置。
【解决方案3】:

你引用了

3> 用户id(整数)通过RPC onSuccess返回给客户端。用户 ID 保存在客户端的静态变量中。

如果用户刷新他的页面,存储在客户端静态字段中的值将被重置,对吗?在那种情况下,会议会结束吗?并且会提示用户再次登录?

【讨论】:

  • 是的,就是这样。
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多