[英]In Rails using devise: How can I find out if a user has logged out from a different browser?
目前,我可以告訴用戶是否已經唱歌,並且已經在線了多長時間,但是我無法確定用戶何時從其他瀏覽器退出。 這是我到目前為止的當前代碼:
- if current_user
= "(last login #{time_ago_in_words(user.current_sign_in_at)} ago) - #{user.current_sign_in_at ? 'currently online' : ''}"
- else
= "(last login #{time_ago_in_words(user.current_sign_in_at)} ago)"
據我所知,Devise中對此沒有特定的規定。 您可以通過在數據庫中存儲特定於該用戶的唯一令牌來跟蹤特定用戶的會話。
創建遷移以添加用於存儲令牌的字段。
檢查每次注銷的令牌,您可以保存時間戳。
我認為,您知道用戶何時從哪個瀏覽器注銷。
希望能幫助到你!
你可以試試
將時間戳記存儲在會話中,以便在一段時間不活動后可以使會話超時。 如果使用Devise,則可以使用timeoutable模塊輕松實現此目的 。 這帶來了一個小難題:如果您將超時設置得太低,那么對於您的用戶來說將非常煩人。 但是超時時間越長,對安全性的用處就越小(如果攻擊者在超時之前進入,他們可以保持刷新以保持會話活動狀態)。
在服務器端跟蹤活動的會話ID(同時仍將實際的會話數據存儲在Cookie中)。 這意味着您可以隨時使會話無效。
添加SessionActivation模型以跟蹤哪些會話處於活動狀態。 這是遷移:
class AddUserActiveSessions < ActiveRecord::Migration
def change
create_table :session_activations do |t|
t.integer :user_id, null: false
t.string :session_id, null: false
t.timestamps
end
add_index :session_activations, :user_id
add_index :session_activations, :session_id, unique: true
end
end
這是課程:
class SessionActivation < ActiveRecord::Base
LIMIT = 20
def self.active?(id)
id && where(session_id: id).exists?
end
def self.activate(id)
activation = create!(session_id: id)
purge_old
activation
end
def self.deactivate(id)
return unless id
where(session_id: id).delete_all
end
# For some reason using #delete_all causes the order/offset to be ignored
def self.purge_old
order("created_at desc").offset(LIMIT).destroy_all
end
def self.exclusive(id)
where("session_id != ?", id).delete_all
end
end
對用戶模型進行一些更改:
class User < ActiveRecord::Base
# ...
has_many :session_activations, dependent: :destroy
def activate_session
session_activations.activate(SecureRandom.hex).session_id
end
def exclusive_session(id)
session_activations.exclusive(id)
end
def session_active?(id)
session_activations.active? id
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.