我有一個場景,我需要限制用戶一次只有一個活動會話。 Mine是一個rails3應用程序,並使用設計進行身份驗證。我只想保持最新的用戶會話處於活動狀態。即如果一個用戶登錄,而另一個會話對同一個用戶名有效,我想停用舊的會話並允許最近的一個。在設計中,是否有辦法獲取用戶會話並使其失效?設計 - 如果同一用戶從不同的瀏覽器/計算機登錄,則會失效用戶會話
4
A
回答
13
您可以通過在數據庫中存儲特定於該用戶的唯一令牌來跟蹤特定用戶的會話。
創建遷移以添加用於存儲令牌的字段。我假設設計模型是用戶。
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)
是有一項掛鉤將被調用每次用戶登錄。如果另一個實例
invalidate_simultaneous_user_session
將註銷當前用戶的當前用戶登錄。這將確保只有一個會話在任何時刻都處於活動狀態。
invalidate_simultaneous_user_session
過濾器應該跳過用戶登錄操作來更新新登錄的用戶令牌。我不喜歡使用Proc根據控制器名稱和操作跳過過濾器。如果您已經覆蓋了設備的sessions_controller
,那麼在該控制器中包含skip_before_filter :check_simultaneous_user_session
,您可以擺脫Proc!
希望這有助於..
1
有關最新設計一種用於軌道4, 你可以根據這個
相關問題
- 1. 如果同一用戶從不同的瀏覽器或計算機登錄,則強制註銷。 Node.js + Express + Socket.IO
- 2. Webapp2 - 當用戶從不同的瀏覽器登錄時使用戶登錄會話無效
- 3. 當用戶在其他瀏覽器中登錄時,在一個瀏覽器中使用戶會話失效?
- 4. 從所有登錄的瀏覽器中刪除用戶會話
- 5. 如果會話失效,則禁用瀏覽器返回按鈕
- 6. 註銷使用表單身份驗證從不同瀏覽器/計算機登錄的用戶
- 7. 爲瀏覽器使用並行cookie會話/同時登錄多個用戶
- 8. 相同的登錄用戶分配不同的會話ID(在不同的瀏覽器)
- 9. 如果用戶從兩個不同的瀏覽器訪問,則CDI會話作用域bean只創建一次
- 10. Rails設計路線:如果用戶登錄,則指向索引。否則,指向新的用戶會話
- 11. iOS用戶登錄會話通過設計但Auth_token不保留
- 12. 如何處理同一用戶使用不同機器或不同瀏覽器登錄應用程序
- 13. codeigniter網站將不會登錄不同的計算機
- 14. 保持用戶在瀏覽器會話之間登錄
- 15. 用戶登錄會話以瀏覽器關閉結束
- 16. 會話丟失用戶登錄
- 17. 如何爲個人用戶創建登錄會話計時器
- 18. 設計:如何禁止從同一會話記錄不同的角色,同時
- 19. 設計 - 爲同一用戶限制多個會話
- 20. 在登錄時破壞設計用戶會話
- 21. 多個帳戶同會話登錄
- 22. ASP.NET成員身份防止用戶同時以不同的計算機上的相同用戶身份登錄
- 23. 如果登錄用戶名會看到不同的看法
- 24. Php用戶登錄會話
- 25. 用戶會話和登錄
- 26. 如何記錄tomcat會話失效或用戶登出
- 27. 從會話登錄的用戶ID
- 28. 不同瀏覽器中的PHP會話
- 29. CSS樣式在同一瀏覽器/不同計算機上的行爲不同
- 30. php,管理員和用戶從同一瀏覽器登錄導致會話變量被非法更改
我認爲你需要更改代碼的額外'''='''在'''c.action_name ='create''''中不分配,但比較操作名稱。即所以它變成:'''c.action_name =='create'''' – ChrHansen
@ChristianHansen哎呀..對不起..糾正! – dexter
看一個例子[here](https://gist.github.com/KieranP/9044432) –