Rails 本体で特定のパスに IP アドレス制限をかける方法

RailsAdmin で Web サービスの管理ページを実装しているんだけど、公開するにあたって、管理ページに誰でもアクセスできるのはマズイ。そこでまず考えるのは、管理ページに IP アドレスの制限をかけること。

ただ、今回は Heroku を使っているので、Apache や Nginx で制限する方法は使えない。Heroku では Rail 本体でやるしかない。ならば Rack ミドルウェアで制限してやればいいと思い、Rack::Access を使うことにした。

Rack::Access は rack-contrib に含まれているので、まず Gemfile に

gem "rack-contrib", require: "rack/contrib"

を記述して

bundle

でインストール。

あとは、config/application.rb で Rack::Access を使うように指定する。

module Sample
  class Application < Rails::Application

   config.middleware.use Rack::Access, {
      "/admins" => ["127.0.0.1", "自分の IP アドレス"],
      "/rails_admin" => ["127.0.0.1", "自分の IP アドレス"],
    }

  end
end

これで、指定した IP アドレスのみ、管理ページと管理者の登録・ログインページにアクセスできるようになった。他の IP アドレスだと 403 Forbidden が返ってくる。

Rack ミドルウェアを使っているので、Rails 以外、例えば Sinatra でも適用できるのがこの方法の長所だな。