2012-09-18 46 views
4

在我的RoR應用程序中,我需要使用基本身份驗證來保護頁面,並且我希望每次用戶鏈接到該頁面時都會詢問憑據。rails authenticate_or_request_with_http_basic

,所以我在手術前增加了一個過濾器,這樣的:

before_filter :request_confirm, :only => [:delete_device] 

和過濾器的方法是:

def request_confirm 

    user = User.find_by_id(session[:user_id]) 

    authenticate_or_request_with_http_basic do |nick, pass| 
    nick == user.nickname and pass == user.password 
    end 

end 

這是確定的,但只有第一次是因爲軌道保存插入的數據,所以下面的時間過濾器將被執行,但憑證不會問。

我不知道在哪裏保存憑證。 。

回答

4

這是如何方法authenticate_or_request_with_http_basic和一般HTTP認證如何工作。 authenticate_or_request_with_http_basic可以重寫爲:「首先嚐試進行身份驗證,如果未通過身份驗證,則請求身份驗證」。該方法的源代碼如下:

def authenticate_or_request_with_http_basic(realm = "Application", &login_procedure) 
    authenticate_with_http_basic(&login_procedure) || request_http_basic_authentication(realm) 
end 

那麼會發生什麼。當您第一次點擊調用此操作的URL時,此authenticate_or_request_with_http_basic將返回401未經授權的HTTP響應。瀏覽器明白這是一個身份驗證請求,並向您顯示一個對話框,用於輸入用戶名和密碼,然後重新發送對相同URL的請求,但將您的憑據包含在請求標頭中。您再次點擊過濾器,此時方法authenticate_or_request_with_http_basic發現請求中存在身份驗證標頭併成功授權您。瀏覽器會將這些auth頭文件發送到這個域的每個請求(直到你關閉瀏覽器)。

所以,如果你只需要測試幾次,你可以關閉並重新打開瀏覽器。我相信只使用這些方法是不可能在每個請求中要求認證和認證的,因爲當應用程序從Auth頭獲得來自瀏覽器的請求時,它不能分辨認證請求之後這是否是請求,或者這些是之前保存的頭。

但是,這可以以某種方式使用cookie或會話中存儲的值完成。

+0

非常感謝你的回答,但我不明白如何使用request_http_basic_authentication(realm)。什麼是領域? 我如何控制插入的暱稱和密碼? 我會寫這樣的: authenticate_or_request_with_http_basic do | nick,pass | nick == user.nickname和pass == user.password end 但使用request_http_basic_authentication(realm) – Dabidi

相關問題