1

ブロックの先頭にauthenticate_or_request_with_http_basicへの呼び出しを追加すると、動作しているコントローラの動作が壊れます。ここでは機能していないアクションコードは次のとおりです。AbstractController :: DoubleRenderErrorを受け取ったとき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」エラー応答を受信して​​います:

と呼ばれていたレンダリングおよび/またはリダイレクトこのアクションで複数回レンダリングまたはリダイレクトを呼び出すことができるのは1回の操作につき1回だけです。また、リダイレクトもレンダリングもアクションの実行を終了させないので、リダイレクト後にアクションを終了するには、 "redirect_to(...)and return"のような処理が必要です。

私は別のアクションで「authenticate_or_request_with_http_basic」のロジックを配置し、indexアクションのためにそれを実行するためにbefore_filterを設定すると、すべてが順調です。しかし、私はインデックス以外のアクションでこのロジックを再利用しているわけではないので、上記のコードが機能しない理由を知りたいと思います。

ソリューション

私はタイラーと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 

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

答えて

1

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

1

HTTPベーシック認証(ステータスコード401未承認)を行うために必要なHTTP応答を送信するためにauthenticate_or_request_with_http_basic呼び出しをレンダリングします。詳細は、Rails codeを参照してください。

+0

その場合、authenticate_or_request_with_http_basicがfalseを返すと、アクションのさらなる実行を中止するにはどうすればよいですか? –

+0

私はauthenticate_or_request_with_http_basicコールをbefore_filterに配置します。 – rkb

+0

1回のアクション内で、さらに実行が停止することはありますか? –

関連する問題