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

Posted

技术标签:

【中文标题】如何让用户在我的网站上登录数月?【英文标题】:How do I keep a user logged into my site for months? 【发布时间】:2011-01-12 06:12:38 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

首先创建一个至少包含cookie_iduser_id 列的数据库表。如有必要,还可以添加 cookie_ttlip_lock。我猜列名不言自明。

在首次登录时(如有必要,仅选中“记住我”选项),生成一个长的、唯一的、难以猜测的密钥(不可能 与用户相关)代表cookie_id 并将其与user_id 一起存储在数据库中。将cookie_id 存储为具有已知 cookie 名称的 cookie 的 cookie 值,例如remember。给 cookie 一个较长的生命周期,例如一年。

在每个请求中,检查用户是否已登录。如果没有,则检查与 cookie 名称 remember 关联的 cookie 值 cookie_id。如果它在那里并且根据 DB 有效,则自动登录与 user_id 关联的用户并再次推迟 cookie 年龄,如果有的话,还有 DB 中的 cookie_ttl

在 Java/JSP/Servlet 术语中,使用 HttpServletResponse#addCookie() 添加 cookie 并使用 HttpServletRequest#getCookies() 获取 cookie。您可以在Filter 中进行所有首次检查,该Filter 会监听所需的资源,例如/* 或者可能会受到更多限制。

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

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

另见:

How to implement "Stay Logged In" when user login in to the web application How do servlets work? Instantiation, sessions, shared variables and multithreading

【讨论】:

感谢 BalusC,您知道所有这些都可以为我实现的任何自动方式吗?还是大多数站点实际上自己制作数据库表和逻辑?我只是认为这是一件很常见的事情,它会被内置到库或语言或其他东西中。 抱歉,没有人想到。但这一切都是你自己真正可行的。如果您不知何故卡住和/或有疑问,请在这里 :) -1 这种方法存在相当大的安全风险。很容易嗅探或以其他方式窃取 cookie 并从网络上的任何地方重复使用它们。这基本上是类固醇的会话劫持。 @sfussenegger:它与普通的 Servlet HttpSession (jsessionid)、php $_SESSION (phpsessionid) 以及其他网络语言/框架使用的任何其他会话结构有何不同?我只是明确地说“生成一个长的、唯一的、难以猜测的密钥(与用户没有任何关系)”。劫持用于加密会话数据的代码并滥用它(特别是如果它是分布式和/或开源的)比猜测/劫持一个完全随机的会话密钥并滥用它更容易。你那生气的-1毫无意义,但如果这让你感觉更好,请成为我的客人:) @sfussenegger:我看到你是这里的另一个回答者。您自己的答案如何更安全?您基本上是将所有敏感信息存储在 cookie 中,而不是存储在服务器端的数据库中!无论加密与否,它都是不安全的,并且每当加密它的代码逻辑被劫持/泄露时,都可能影响到所有用户。此外,您可能错过了我在回答中提到的cookie_ttlip_lock 的全部要点。【参考方案2】:

嗯,我选择 OpenID 的最初原因是让其他人可以为我处理身份验证的实施和安全性。

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

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

因此,我认为我可以将用户的 openID url 存储在 cookie 中,并使用即时请求来查看用户是否经过身份验证。这样我就不必对我的数据库做任何事情,或者实现任何逻辑来防止会话劫持长寿命的 cookie。

这种做法似乎是 OpenID 建议使用他们的Relying Party Best Practices 文档的方式。

【讨论】:

这当然是一个更适合 OpenID 意识形态的有趣替代方案。然而,我自己还没有在我的 webapps 中使用 OpenID,但是在阅读了一个和另一个之后,我会说,按照你链接的文档中的描述去做。 这可能是最好的答案

以上是关于如何让用户在我的网站上登录数月?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenID 作为我网站的登录名 - 冗余提供商

大家好,一旦他们登录到网站,我如何在导航栏上显示用户名?

如何获取在我的网站上发帖的用户的地理区域并将其存储在数据库中[关闭]

在我的网站和 wordpress 博客之间共享会话

使用 PHP 显示在线用户列表

提示登录后如何将 $_POST 数据传递到 youtube 上传脚本