簡體   English   中英

使用Devise in Rails注銷特定用戶

[英]Sign out specific user with Devise in Rails

我有用於用戶身份驗證的Devise。 我想簽出具有特定ID的用戶。

在我的控制器中

  def exit
    @user = User.find(5)
    sign_out(@user) # this line here signs out the current_user   
  end

設計的注銷命令,即使我通過@user,它也會注銷current_user。 如何從數據庫中選擇用戶並使用設計命令將其注銷?

我假設這是一些管理模塊的一部分,你想要簽署一個特定的用戶。

但是,這並不容易解決。 是否登錄用戶存儲在會話中。 因此,要簽出其他用戶,您必須有權訪問其會話。

注意:afaik sign_out方法僅適用於當前會話,或者可能通過warden(不知道warden足夠好)它可以擴展到當前服務器曾經觸及的所有會話。 但是:如果你使用乘客或某種形式的rails服務器集群(這很常見),afaik這將無效。 我有興趣聽到其他說法,但有一些解釋:) sign_out使用給定的參數來確定從(afaik)當前會話中退出的范圍。

所以我們通常做的是添加一種緊急按鈕來注銷所有用戶:這會破壞所有會話。 請注意,這當然只有在使用某些數據庫或文檔存儲支持的會話存儲時才有可能。

或者,您可以打開所有會話,並查找正確的會話(針對您的用戶),然后銷毀這些會話。

要從存儲在activerecord中的特定會話中讀取數據,可以編寫以下內容:

@session = ActiveRecord::Base.connection.select_all( "SELECT * FROM sessions WHERE session_id = '#{sess_id}'" )
Marshal.load(ActiveSupport::Base64.decode64(@session.data))

還有其他方法:

  • 使用Timeoutable模塊,並強制用戶超時?
  • 如果您使用Rememberable您可以執行@user.forget_me ,但我不確定這是否會影響當前會話?

從設備api doc http://rubydoc.info/github/plataformatec/devise/master/Devise/Controllers/SignInOut#sign_out-instance_method中 ,sign_out(@user)方法應該有效。 有可能current_user偶然的id為5嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM