2011-10-03 11 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に設定されているため、2番目のテストが失敗します。

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

それは良さそうに見えますが、それは非必要な複雑さを追加します。ここでは

が正しくsession[:admin]を設定し、両方のテストに合格させるために私のコードです。私は、ユーザーがログに記録されているかどうかを確認するためにセッションを使用できるかどうかを考えます。何か案は? – Vitaly

関連する問題