gpt4 book ai didi

ruby-on-rails-3 - 设计 - 如果同一用户从不同的浏览器/计算机登录,则用户 session 无效

转载 作者:行者123 更新时间:2023-12-03 00:43:38 25 4
gpt4 key购买 nike

我有一个场景,我需要限制用户一次只有一个事件 session 。我的是一个rails3应用程序并使用设备进行身份验证。我有兴趣仅保持最新的用户 session 处于事件状态。即,如果用户登录时同一用户名有另一个 session 处于事件状态,我想停用旧 session 并允许最近的 session 。有没有一种方法可以获取用户 session 并使它们无效?

最佳答案

您可以通过在数据库中存储特定于该用户的唯一 token 来跟踪特定用户的 session 。

创建迁移以添加用于存储 token 的字段。我假设设备模型是 User。

class AddSignInTokenToUsers < ActiveRecord::Migration
def change
add_column :users, :current_sign_in_token, :string
end
end

将以下代码添加到application_controller.rb

class ApplicationController < ActionController::Base
before_filter :invalidate_simultaneous_user_session, :unless => Proc.new {|c| c.controller_name == 'sessions' and c.action_name == 'create' }

def invalidate_simultaneous_user_session
sign_out_and_redirect(current_user) if current_user && session[:sign_in_token] != current_user.current_sign_in_token
end

def sign_in(resource_or_scope, *args)
super
token = Devise.friendly_token
current_user.update_attribute :current_sign_in_token, token
session[:sign_in_token] = token
end
end

sign_in(resource_or_scope, *args) 是一个设计钩子(Hook),每次用户登录时都会调用它。

invalidate_simultaneous_user_session 如果当前用户的另一个实例登录,则将注销当前用户。这将确保在任何时间只有一个用户 session 处于事件状态。

对于用户登录操作,应跳过

invalidate_simultaneous_user_session 过滤器,以更新新登录用户的 token 。我不满意使用 Proc 根据 Controller 名称和操作跳过过滤器。如果您已经覆盖了设备的 sessions_controller,则在该 Controller 内包含 skip_before_filter :check_simultaneous_user_session,您就可以摆脱 Proc!

希望这有帮助..

关于ruby-on-rails-3 - 设计 - 如果同一用户从不同的浏览器/计算机登录,则用户 session 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7359730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com