🧑‍💻

Sidekiqの管理画面をアクセス制限する方法3選

2021/07/08に公開

BASIC認証とDeviceを使った方法はよく見かけるのですが、
自前で用意した認証機能でSidekiqの管理画面へのアクセスを制限する方法についての情報が見当たらなかったので備忘録として残しておきます。

Railsにて非同期処理をする際にSidekiqを使う場合に、
Sidekiqが用意している管理画面をルーティングにマウントすることがあると思います。

require 'sidekiq/web'

Rails.application.routes.draw do
  mount Sidekiq::Web, at: '/sidekiq'
end

ただ、本番環境でも同様に確認したいこの画面に第三者がアクセスできてしまうのは困るので、
認証をつけるのがベターなのかなと思います。

1. BASIC認証を使った方法

こちらの方法を使うなら環境変数などを使ってください。

require 'sidekiq/web'

Rails.application.routes.draw do
  Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
    [user, password] == ['user', 'password']
  end
end

2. Deviceを使った方法

authenticatedを使うことで簡単に実装できます。

authenticate :user do #authenticate
  mount Sidekiq::Web => '/sidekiq'
end

3. 自前の認証機能(セッションを使った方法)

constraintsを使うことでいい感じに実装できます。

例えばAdminというモデルでセッションにadmin_idが入っていたら認証が通る機能だとした場合、
以下の実装で実現可能です。

class AdminAuthConstraint
  def matches?(request)
    return false if request.session[:admin_id].blank?

    Admin.exists?(request.session[:admin_id])
  end
end

Rails.application.routes.draw do
  mount Sidekiq::Web => '/sidekiq', constraints: AdminAuthConstraint.new
end

もし他に良い方法ありましたら、ご教授ください🙇‍♂️

Discussion