如何让用户登录我的网站数月?

2022-09-02 23:36:29

我正在使用OpenID。如何使用户即使在关闭浏览器窗口后也能长时间保持登录状态?

如何存储和访问用户的对象?User

基本上,我想我只是不真正了解会话在Java中是如何工作的。


答案 1

所以你真的想要一个“在这台计算机上记住我”选项吗?这实际上与OpenID部分无关。以下是与语言无关的方法:

  • 首先创建一个至少包含和列的数据库表。如有必要,还要添加和 。我想列名不言自明。cookie_iduser_idcookie_ttlip_lock

  • 首次登录时(如有必要,仅在选中“记住我”选项的情况下),生成一个长而唯一,难以猜测的密钥(与用户无关),该密钥表示并将其与.将具有已知 Cookie 名称的 Cookie 的 cookie 值存储为 cookie 值,例如 .给饼干很长的使用寿命,例如一年。cookie_iduser_idcookie_idremember

  • 在每个请求中,检查用户是否已登录。如果没有,请检查与 Cookie 名称关联的 Cookie 值。如果它在那里并且根据数据库是有效的,那么自动登录与文件关联的用户,并再次推迟cookie的年龄,如果有的话,也是在数据库中。cookie_idrememberuser_idcookie_ttl

在Java/JSP/Servlet术语中,使用HttpServletResponse#addCookie()来添加cookie,并使用HttpServletRequest#getCookies()来获取cookie。您可以执行所有首次签入,该签入会监听所需的响应,例如 或者可能更受限制。Filter/*

关于会话,您在这里不需要它。它的使用寿命比您需要的要短。仅当它具有有效的cookie时,才使用它来放置登录用户或“找到”的用户。这样,只需检查其在会话中的存在,然后就不需要每次都检查cookie。rememberFilter

毕竟,这是相当直截了当的。祝你好运。

另请参阅:


答案 2

好吧,我选择OpenID的最初原因是为了让其他人可以为我处理尽可能多的身份验证的实现和安全性。

在对OpenID进行了更多的研究之后,似乎有一种叫做“即时请求”(http://openid.net/specs/openid-authentication-2_0.html#anchor28)的东西。

请求身份验证时,信赖方可以请求 OP 不与最终用户交互。在这种情况下,OP 必须立即响应,断言身份验证成功,或者响应指示在没有进一步用户交互的情况下无法完成请求。

因此,我认为我可以将用户的openID url存储在cookie中,并使用即时请求来查看用户是否已通过身份验证。这样,我就不必对数据库执行任何操作,也不必实现任何逻辑来防止会话劫持长期存在的cookie。

这种方法似乎是OpenID建议使用其信赖方最佳实践文档的方式。


推荐