今までRailsではDeviseを使って認証していたので
たとえばResque::Server
などmountするアプリケーションを追加したい場合
次のようなコードをconfig/routes.rb
に追記すれば特定ロールのユーザーに対してのみ公開できるようにできていた
- config/routes.rb
require 'resque/server'
authenticate :user, ->(user) { user.admin? } do
mount Resque::Server.new, :at => '/resque'
end
authenticate
を使用して条件付きでmountさせるという感じ
ただ、deviseを使っていない場合はどうすれば良いんだろうこということで、どのような方法があるか調べた
constraints
特定のルーティングに対して制限を掛けられる
詳しい実装方法やパターンは次のドキュメントに載っている
Rails Routing from the Outside In — Ruby on Rails Guides
[https://guides.rubyonrails.org/routing.html#advanced-constraints:embed:cite]
クラスを定義する場合はmatches?
メソッドを用意して真偽値を返す
引数にrequestが渡ってくるのでその中にid
なり何なりをもたせておけばそれをもとにUserを持ってきてAdminか?みたいなチェックを行うことで制限を掛けられる
lambdaでその場に直接処理を書いてしまうことも可能
セッションにUserのIDなどをもたせておけばログイン時かつそのユーザーが管理者であればページを公開するといったことがサクッと書ける
サンプル
- config/routes.rb
require 'resque/server'
mount Resque::Server.new, :at => '/resque', constraints: lambda { |req| req.session['user_id'].present? && User.find_by(id: req.session['user_id']).admin? }
今まで思考停止でやっていたので勉強になりました