0

Deviseを使用するアプリに新しいログイン条件を追加しようとしています。

ホワイトリストにない IP からリクエストが送信された場合、ログインを防止し、サインイン ページにリダイレクトして、外部 IP からのログインであることを説明するフラッシュ メッセージを表示したいと考えています。

リダイレクトは機能しますが、設定したフラッシュ メッセージがサインイン ページに戻りません。これは、Devise が不思議なことにリダイレクト チェーンに別のリダイレクトを追加しているためだと思います (フラッシュ メッセージは 1 つの要求にしか有効でないため、フラッシュ メッセージが強制終了されます)。

私がやっていることは次のとおりです。リクエストのIPがホワイトリストにあるかどうかを確認します。そうでない場合は、リダイレクトし/users/sign_inてフラッシュ通知を設定し、ユーザーがログインできない理由を表示します。

ここで迷子になります... へのリダイレクトが/users/sign_in発生した後、ユーザーは不思議なことに にリダイレクトされ/、さらに にリダイレクトされ/users/sign_inます。

sign_in ページに戻る最後のリダイレクトは、ユーザーがログインしていない場合に備えて独自に定義したものです。しかし、ルート URL に戻るリダイレクトは私をつまずかせます。私は session_controller のアクションをオーバーライドしていませんnew(この不思議なリダイレクトが発生する場所です...)。

誰かが何が起こっているのか推測していますか、そのリダイレクトを引き起こすデバイス構成がありますか、またはこの全体にアプローチする別の方法はありますか?

私のsessions_controllerで

class SessionsController < Devise::SessionsController

  def create

    unless ip_whitelist.include?(request.remote_ip)
      redirect_to '/users/sign_in', :notice => "Cannot log in from this IP address."
      return
    end

    ...

  end
end
4

1 に答える 1

1

Devise wiki によるactive_for_authenticationと、ユーザー モデルにメソッドを追加することで、ユーザーの「検証」を追加できます。それ以外の場合、devise_forルーティング メソッドは、:constraints通常の Rails ルーティング制約と同様にオプションを受け入れます。ホワイトリスト ロジックを応答するクラスにパックするmatches?と、うまくいくはずです。

于 2012-05-30T17:00:22.560 に答える