【问题标题】:Check if user has been timed out in Devise检查用户是否在设计中超时
【发布时间】:2017-04-23 22:45:03
【问题描述】:

因为我使用 javascript 来执行操作而不是控制器方法,所以我需要在呈现该操作之前检查用户是否已超时。为此,我尝试在 application_controller.rb 中添加和删除 cookie,如下所示:

Warden::Manager.after_set_user do |user,auth,opts|
  auth.cookies[:signed_in] = 1
end

Warden::Manager.before_logout do |user,auth,opts|
  auth.cookies.delete :signed_in
end

在我的 javascript 文件中:

myCookie = getCookie("signed_in");
if (myCookie == null)
{
  //redirect to sign in page
} else {
  //perform my action
}

function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  }
  else
  {
    begin += 2;
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
    end = dc.length;
    }
  }
  return decodeURI(dc.substring(begin + prefix.length, end));
} 

但是,这似乎不适用于会话超时,仅适用于注销。我已经看到了一些 hacky 方法来实现这一点,但我似乎无法直接从 Devise 或 Warden 找到任何东西来使用或覆盖一种方法来测试用户是否已超时或在用户已超时时采取行动时间到。我在 Rails 5 和 Devise 4.2.1 上。

【问题讨论】:

    标签: javascript ruby-on-rails session devise timeout


    【解决方案1】:

    你需要向服务器发出请求那个action来查看用户是否超时,因为当你设置了超时时间,也就是服务器端,所以这个时间过去了,客户端没有变化,唯一知道的方法是向服务器发出 ajax 请求以查看会话是否超时user.timedout?(Time.now.utc) 或直接对操作请求进行验证(在控制器中),用户将始终尝试运行该操作,但是在服务器上,您验证用户是否超时,然后您不要让他们这样做并重定向到登录页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多