更新します。一般的な考慮事項として、ターゲットサーバーが公開されていると仮定すると、中間サーバーでのみチェックするのは安全ではないため、認証戦略を考える必要があります。
基本的に、あなたの質問に対する答えは、Devise は Rails アプリケーションに独自のミドルウェアを追加しないため、ミドルウェアで Devise を使用することはできません。Warden ミドルウェアを使用できる可能性があります。
Devise は Warden の上に乗っています。Deviseは、ミドルウェア スタックの最後にミドルウェアを挿入します (omniauth ミドルウェアも挿入できます) 。 Warden::Manager
# Initialize Warden and copy its configurations.
config.app_middleware.use Warden::Manager do |config|
Devise.warden_config = config
end
それ以外では、Devise は Rails アプリケーション レベルで動作します。つまり、sign_in
コントローラーなどのヘルパーを追加します。ただし、ミドルウェアレベル自体では機能しません。
Warden 自体は「怠け者」であり、ここで説明されています
Warden は怠惰になるように設計されています。つまり、使用しない場合は何もしませんが、使用するとすぐに動作し、ラックベースのアプリケーションで認証を許可する基本的なメカニズムを提供します。
したがって、Devise が何らかの方法で Warden を操作しない限り、Warden はあまり機能しません。Warden が行うことは、他のミドルウェア (および Rails アプリケーションも同様) からアクセス可能な環境変数に自分自身を埋め込むことです。このインスタンスを使用するように工夫してください。
env['warden'] = Proxy.new(env, self)
Warden は、他のミドルウェア (またはエンドレールアプリケーション) がスローできる特別な warden 例外もリッスンします。
result = catch(:warden) do
@app.call(env)
end
ミドルウェアで Warden を使用するには、(ターゲット ミドルウェアの前に) ミドルウェアに組み込む必要があります。その後、Warden を使用できるようになります (Devise ヘルパーではありません!)。
warden sourceのコメントによると、セッション構築ミドルウェアの後に (それより前に) 埋め込む必要がありますActionDispatch::Session::CookieStore
。
ラック認証用のミドルウェア ミドルウェアはアップストリームにセッションがあることを要求します ミドルウェアは認証オブジェクトをラック環境ハッシュに挿入します
セッションのWardenアクセサー:
def session
env["rack.session"] || {}
end