新手问题 从 Ruby China 的登录表单来说 Devise 的问题:“记录登录状态” 不生效

diguage · 2013年11月25日 · 最后由 diguage 回复于 2013年11月26日 · 3765 次阅读

为了吸引眼球,俺榜上 RubyChina 这种大山。

背景简介

最近使用 Devise 来做网站帐号相关的功能。但是,发现一个诡异问题。本以为 RubyChina 的实现应该是正确的,可以成为我的 “剽窃对象”。但是,经过测试后发现,竟然也有同样的问题。所以,这里就拿 RubyChina 来开刀。

问题描述

最近的项目中,帐号相关的功能使用 Devise 来实现的。确实很方便,但是也发现了一个诡异问题: 无论是否勾选 “记住登录状态”,在下次打开的时候,都是 “已登录”。

刚开始,我不会知道怎么用 Devise。然后就上网各种使用 Google 百度一下。后来,发现下面这个这个解决方案:Devise - remember me not working? LocalHost Issue? 。检查一下,我的代码,和这里的方案没有差异。然后就想到了 RubyChina。想看看 RubyChina 是怎么搞的。

下面开始对 RubyChina 庖丁解牛。(由于只是检查 RubyChina 是否有类似问题。没有深入到代码级别。)

首先看一下 RubyChina 登录页面生成的表单标签。 RubyChina登录表单

当不选择 “记住登录状态” 时,提交的表单数据如下: 当不选择“记住登录状态”时,提交的数据

当选择 “记住登录状态” 时,提交的表单数据如下: 当选择“记住登录状态”时,提交的数据

问题列表:

  • 为什么会生成如下的代码:

    <input name="user[remember_me]" type="hidden" value="0" />  
    
  • 为什么 “记住登录状态” 无效?我的猜测是当选择 “记住登录状态” 时,同时提交了两个user[remember_me],而服务器使用了user[remember_me]=1。但是,奇怪的是,当不选择 “记住登录状态” 时,向服务器提交了user[remember_me]=0,还是记住了密码。这个问题真的有点诡异。莫非是 Devise 的 Bug?

环境说明

没有看 RubyChina

  • 我自己项目中的环境:

    • Rails 3.2.14
    • Devise 3.0.3
    • Rails 原生表单
    • 相关表单字段的代码 html <%= f.check_box :remember_me, :as => :boolean, class: 'remember' if devise_mapping.rememberable? %> <%= f.label :remember_me, "记住密码" %>
  • RubyChina 中的环境:

    • Rails 4.0
    • Devise 3.0.1
    • simple_form 3.0.0.rc
    • 相关表单字段的代码 html <div class="inputs-list"> <label for="user_remember_me"> <%= f.check_box :remember_me, :style => "width:auto;" %> <%= t("common.remember_me") %> </label> </div>

RubyChina 的环境,我是根据源代码写出来的。

会不会是浏览器的记住密码的功能导致的?

额,确实有这个问题,来修一下

#1 楼 @tyaccp_guojian 记住密码只是记住用户名密码 , 并不能达到记住用户登录状态的能力 . 我没用过 Devise , 但是看起来应该是它无论如何都写入了 remember_tokencookie 了 .

找到原因了,表单是没有问题的,问题是 Rails 的 session_store.rb 里面设置的 Cookie 周期和 Devise 冲突了。

Ruby China 目前的 session_store.rb

RubyChina::Application.config.session_store :cookie_store,
                            :key => '_homeland_session',
                            :expire_after => 86400*90

我尝试了一下,将 expire_after 注释掉,并分别测试 Devise 的记住密码和不记住密码,得到的结果就正确了。

如果勾选 “记住登录状态” 的话,Devise 会额外记录一个 Cookie

  • remember_user_token - 并有一定的有效期

@song940 我经常去的网站都不用登陆,每次去了都是自动登陆

#5 楼 @huacnlee RubyChina 更新没?我来测测。哈哈

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