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 を返します。