4

私の RoR アプリケーションでは、基本認証でページを保護する必要があり、ユーザーがそのページにリンクするたびに資格情報を要求する必要があります。

だから私は次のように、操作の前にフィルターを追加しました:

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

1 に答える 1

6

これがメソッド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_basicHTTP 応答 401 Unauthorized が返されます。ブラウザーは、これが認証の要求であることを認識し、ユーザー名とパスワードを入力するためのダイアログを表示してから、同じ URL の要求を再送信しますが、資格情報を要求ヘッダーに含めます。フィルターが再びヒットし、今度はメソッドauthenticate_or_request_with_http_basicがリクエストに認証ヘッダーがあることを確認し、正常に承認します。そして、ブラウザーは、このドメインへの後続の各要求でこれらの認証ヘッダーを送信します (ブラウザーを閉じるまで)。

したがって、数回テストする必要がある場合は、ブラウザを閉じて再度開くことができます。これらの方法のみを使用して、認証を要求し、すべての要求で認証することは不可能だと思います。アプリケーションがブラウザーから Auth ヘッダーを使用して要求を受け取ると、これが認証要求の直後の要求であるか、以前に保存されたヘッダーであるかを判断できないためです。

ただし、これは、セッションに保存された Cookie または値を使用して何とか達成できます。

于 2012-09-19T13:06:17.723 に答える