1

authenticate_or_request_with_http_basicブロックの先頭に呼び出しを追加すると壊れるコントローラーアクションがあります。機能しないアクション コードは次のとおりです。

def index
  authenticate_or_request_with_http_basic do |username, password|
    username == "test1" and password == "test"
  end

  render layout: false, content_type: 'application/xml'
end

ブラウザ ウィンドウに「AbstractController::DoubleRenderError」エラー応答が表示され、次のメッセージが表示されます。

このアクションでレンダリングやリダイレクトが複数回呼び出されました。render または redirect のみを呼び出すことができ、アクションごとに最大 1 回しか呼び出せないことに注意してください。また、redirect も render もアクションの実行を終了しないことに注意してください。したがって、リダイレクト後にアクションを終了する場合は、「redirect_to(...) and return」のようなことを行う必要があります。

「authenticate_or_request_with_http_basic」ロジックを別のアクションに配置し、before_filter を構成してインデックス アクションに対して実行すると、すべて問題ありません。ただし、インデックス以外のアクションにはこのロジックを再利用していません。上記のコードが機能しない理由を知りたいです。

解決

Tyler と RKB の助けを借りて、解決策を見つけることができました。ここにあります:

authenticated = authenticate_or_request_with_http_basic "Authentication Required" do |username, password|
  @user = User.find_by_username(username)
  @user != nil && password == "test"
end
return unless authenticated == true 

authenticate_or_request_with_http_basic認証が成功した場合は「true」を返します。失敗すると 401 を返します。

4

2 に答える 2

1

authenticate_or_request_with_http_basic がレンダリングまたはリダイレクトしているようです。コールバックチェーンをキャンセルして2番目のレンダリングが発生しない原因となるfalseを返すため、before_filterに移動すると機能すると思いますか? 推測ですが...

于 2011-12-22T20:01:43.473 に答える
1

authenticate_or_request_with_http_basic 呼び出しは、HTTP 基本認証 (ステータス コード 401 Unauthorized) を実行するために必要な HTTP 応答を送信するためにレンダリングします。詳細については、Rails コードを参照してください。

于 2011-12-22T20:02:50.890 に答える