2011-10-03 91 views

回答

10

維塔利的做法看起來像一個很好的解決方案,但一個嚴重的錯誤,授予管理員訪問任何嘗試登錄的人,即使他們的憑據不正確。

首先,一對夫婦的功能測試(上行動需要身份驗證)(它被upvoted人們不要盲目接受它的安全漏洞的「正確」答案張貼這在希望的答案)

test "admin is set with correct credentials" do 
    @request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "pass") 
    get :index 
    assert_response 200 
    assert_equal true, session[:admin] 
end 

test "admin isn't set with incorrect credentials" do 
    @request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials("user", "incorrect") 
    get :index 
    assert_response 401 
    assert_not_equal true, session[:admin] 
end 

如果使用Vitaly的代碼運行此操作,則第二個測試將失敗,因爲session[:admin]將被設置爲true,即使密碼不正確。

這裏是我的代碼,以正確設置session[:admin],使這兩個測試通過:

private 
def authenticate 
    authenticate_or_request_with_http_basic do |user_name, password| 
    session[:admin] = (user_name == "name" && password == "pass") 
    end 
end 
+0

謝謝你,你是對的。我是如何犯這個錯誤的。希望沒有多少人受到影響。 對不起,改變正確的答案這麼晚了。我沒有注意到這個通知。 – Vitaly

0

您可以使用基本身份驗證慘慘的工作,閱讀本指南https://github.com/ryanb/cancan/wiki/changing-defaults,那麼就使用康康舞爲通常情況下,您可以根據登錄的用戶名設置權限。

+0

它看起來不錯,但它增加了非必要的複雜性。我想到使用會話來檢查用戶是否登錄的可用性。有任何想法嗎? – Vitaly