新手问题 Rails 中如何实现 “忘了我” 的功能?

spacewander · 2014年09月23日 · 最后由 spacewander 回复于 2014年09月24日 · 2464 次阅读

一般网站在登录的时候,都会提供一个“记住我”的选项,如果选中该选项,下次就不用重新登录了。

在 Rails 里面实现“记住我”,最简单的办法是设置

Rails.application.config.session_store :cookie_store, expire_after: # 一段相当长的时间

这样 Rails 就会在浏览器里面设置一个要过一段相当长的时间才会过期的 cookie。那么下次访问的时候,一旦检测到这个 cookie 的存在,就不用重新输入密码了。代价是,忘记密码的可能性增加了……

不过,让我们看下反面的问题,如果用户不勾选那个“记住我”,那么怎么来实现 忘了我 这个功能呢?

session_store的设置是全局的,而且session类没有提供expires的设置。cookie倒是提供了,不过虽然 session 默认是用 cookie 实现的,但是cookiesession又不能混用……

另外一个方法是设置一个session[last_login],用它来保留上次访问的时间。但是这么一来,每次检查session里面的内容时,都得检查session[last_login],这样做要改动很多地方,而且不易维护(除非把session包装成 Session 类)。

所以在这里问一下大家,还有什么办法可以动态设置 session 的过期时间的?


BTW,Ruby-china 的编辑框的 markdown 解析有点问题……只有**粗体**左边是空格的情况下才能 加粗,否则就不能加粗。同样的,*斜体*~~删除线~~也是这样

Markdown 的确有问题

我们公司发现 Bug 会开发者发个 Car,不是轿车,是 Corrective Action Request,有个在线系统。

每次新版本发布前我就能收到一堆 Car,不是我的问题也发给我,压力好大。

不知道我们的豪 @huacnlee 最近钱数完了没有,楼主有个 Car 发给你。

#1 楼 @Peter 我果然有罕见的引 bug 体质

很奇怪为什么要把 session 设置成不过期,session 本来就是用来暂存会话数据的地方,会话结束,数据也就没用了。 如果是需要持久化的数据,要么存在服务器端数据库中,要么是客户端 cookie 中,所以,你为什么不直接操作 cookie,把用户登录令牌存进去。而且可以设置过期时间。

#3 楼 @lolychee 啊,我的意思是动态设置 session 的过期时间。之所以不用 cookie……是因为原来都是用 session 的,要改成 cookie 的话工作量有点大😢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号