2015-09-04 92 views
1

這個Rails項目有一個API端發送數據到iOS版本的應用程序。它使用Devise :: Lockable在用戶帳戶登錄失敗三次時鎖定用戶帳戶。Rails:通過未經授權的請求持續參數?

這是一個奇怪的邊緣情況,但可能並不罕見:情況始於已登錄到桌面版本。如果我然後在iOS應用程序中登錄失敗3次,但從桌面版本單擊我的電子郵件中的重置密碼鏈接,因爲我已經登錄,所以對edit_password_url的請求未經授權(因爲該帳戶被鎖定),我被重定向到登錄頁面。

什麼是我可以讓它仍然去edit_password_url同時保持參數(特別是密碼重置令牌)?我想無論是:

  • 跳過驗證密碼編輯頁面(似乎不好,但我仍然沒有看到如何做到這一點)
  • 創建一些一系列的檢查請求的過濾器,然後重定向回 到edit_password_url ...但我如何保留重置密碼 令牌?
  • 或者,我可以以某種方式在該用戶通過API登錄失敗的過程中,在主應用程序 中強制退出用戶。但是這些是命名空間和不同的控制器下,我還沒有找到一種方法來強制簽名。

回答

1

如果存在活動會話,設計中會有幾個動作在重定向。我從來不喜歡這種行爲,通常會覆蓋它。如果我點擊一個鏈接,那是因爲我想要執行該操作。

例如,訪問登錄鏈接時,您可能希望以不同的用戶身份登錄,以便您可以覆蓋該操作以註銷是否直接點擊,而不是重定向。因此,對於我的例子中,你將繼承Devise::SessionsController

class SessionsController < Devise::SessionsController 
    skip_before_filter :require_no_authentication, only: [:new] 

    def new 
    if warden.authenticated?(resource_name) 
     sign_out 
    end 
    super 
    end 

    private 

    def sign_out 
    # From Devise::SessionsController#destroy 
    Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name) 
    end 
end 

和航線覆蓋它:

devise_for :users, controllers: {sessions: 'sessions'} 
+0

這是如此接近,我認爲這會,如果我沒有使用spree_auth_devise工作。你熟悉嗎?我想編輯我的密碼控制器到你已經顯示的類似的東西,但是文件開始是這樣的:'Spree :: UserPasswordsController.class_eval do'而不是'UserPasswordsController :edit'放入,但它仍然是驗證和重定向。有任何想法嗎? – batmanbury

+0

您可以擴展'Spree :: UserPasswordsController',但您需要使用'skip_before_filter'。 'before_filter'(或者更好的'before_action')不會覆蓋以前的聲明......你試過了嗎? – aceofspades

+0

我明白了。 「跳過」部分似乎不直觀。所以:'skip_before_filter:require_no_authentication,只:[:編輯]'實際上會跳過驗證? – batmanbury