如何使所有单个用户会话无效?

时间:2015-03-23 10:34:42

标签: ruby-on-rails-4 devise

使用设计,用户登录公共计算机,他们忘记注销。

稍后,我们要确保会话无效,以便将浏览器重定向到登录页面。

我怎样才能做到这一点?

我知道我可以为所有用户无效所有会话,但我怎么能为单个用户执行此操作(因此它不会影响所有用户)。

如果您更改了密码,我会读到有关密码更改的内容,是否可以应用于此问题?

2 个答案:

答案 0 :(得分:5)

这对我有用。

我为每个用户提供session_validity_token,并在登录时将其存储在会话数据中。每次访问服务器时都会进行检查。要强制所有浏览器上的所有会话都必须重新登录,我只需清除令牌即可。

$ rails g migration add_session_validity_token_to_users session_validity_token
$ rake db:migrate
  

配置/初始化/ devise.rb:

Warden::Manager.after_set_user except: :fetch do |user, warden, opts|
  user.update_attribute(:session_validity_token, Devise.friendly_token) if user.session_validity_token.nil?
  warden.raw_session["validity_token"] = user.session_validity_token
end

Warden::Manager.after_fetch do |user, warden, opts|
  unless user.session_validity_token == warden.raw_session["validity_token"]
    warden.logout
  end
end
  

应用程序/模型/ user.rb

def force_logout
  update_attribute(:session_validity_token, nil)
end

答案 1 :(得分:1)

您可以通过两种方式实现以下目标

  1. 在设计中你可以设置会话超时,这将确保会话将超时,用户将不得不再次登录,但这将影响每个用户,即所有用户会话将在固定的时间间隔后超时时间。
  2. 例如

    class User < ActiveRecord::Base
    devise :timeoutable, :timeout_in => 15.minutes
    
    1. 实现此目的的第二种方法是创建用户将登录的白名单ips,如果用户从未被用户列入白名单的IP登录,则可以在那里实现会话逻辑。
    2. 希望有所帮助