如何使所有单个用户会话无效?
How can I invalidate all of a single users sessions?
用户使用设计在 public 台计算机上登录,但他们忘记注销。
稍后,我们要确保会话无效,以便浏览器重定向到登录页面。
我怎样才能做到这一点?
我知道我可以使所有用户的 all 会话无效,但我如何才能对单个用户执行此操作(因此它不会影响所有用户)。
我读到一些关于如果您更改密码会更改密码盐的内容,是否可以应用于此问题?
有两种方法可以实现以下目的
- 在设计中,您可以设置会话超时,这将确保会话超时并且用户将不得不重新登录,但这会影响每个用户,即所有用户会话都会在固定时间间隔.
例如
class User < ActiveRecord::Base
devise :timeoutable, :timeout_in => 15.minutes
- 实现此目的的第二种方法是创建一个用户将从中登录的 ip 白名单,如果用户从未被用户列入白名单的 ip 登录,则可以在那里实现会话逻辑。
希望对您有所帮助
这对我有用。
我给每个用户一个 session_validity_token,并在他们登录时将其存储在他们的会话数据中。每次他们访问服务器时都会检查它。要强制所有浏览器上的所有会话都必须重新登录,我只需清除令牌即可。
$ rails g migration add_session_validity_token_to_users session_validity_token
$ rake db:migrate
config/initializers/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
app/models/user.rb
def force_logout
update_attribute(:session_validity_token, nil)
end
用户使用设计在 public 台计算机上登录,但他们忘记注销。
稍后,我们要确保会话无效,以便浏览器重定向到登录页面。
我怎样才能做到这一点?
我知道我可以使所有用户的 all 会话无效,但我如何才能对单个用户执行此操作(因此它不会影响所有用户)。
我读到一些关于如果您更改密码会更改密码盐的内容,是否可以应用于此问题?
有两种方法可以实现以下目的
- 在设计中,您可以设置会话超时,这将确保会话超时并且用户将不得不重新登录,但这会影响每个用户,即所有用户会话都会在固定时间间隔.
例如
class User < ActiveRecord::Base
devise :timeoutable, :timeout_in => 15.minutes
- 实现此目的的第二种方法是创建一个用户将从中登录的 ip 白名单,如果用户从未被用户列入白名单的 ip 登录,则可以在那里实现会话逻辑。
希望对您有所帮助
这对我有用。
我给每个用户一个 session_validity_token,并在他们登录时将其存储在他们的会话数据中。每次他们访问服务器时都会检查它。要强制所有浏览器上的所有会话都必须重新登录,我只需清除令牌即可。
$ rails g migration add_session_validity_token_to_users session_validity_token
$ rake db:migrate
config/initializers/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
app/models/user.rb
def force_logout
update_attribute(:session_validity_token, nil)
end