こんにちは、たにーです。
今回もadminについてです。
admin専用のページには、adminだけが見れるのが当たり前だと思います。
ただ、チーム開発で他のチームでアクセス制限が出来ていないのが見られました。
今回は、その設定方法をまとめます。
他にも方法があると思いますが、チームメンバーで考えた結果これぐらいかなと思ってます。
他にあれば教えてください。
adminページのアクセス制限
下記は、現在のルートです。
adminでitemのindex~showまであるとします。
Prefix Verb URI Pattern Controller#Action
admin_items GET /admin/items(.:format) admin/items#index
POST /admin/items(.:format) admin/items#create
new_admin_item GET /admin/items/new(.:format) admin/items#new
edit_admin_item GET /admin/items/:id/edit(.:format) admin/items#edit
admin_item GET /admin/items/:id(.:format) admin/items#show
もし、アクセル制限を行わないと、
管理者でない通常のお客さんでも商品登録が出来ちゃいます。(笑)
方法①
adminがもつコントローラーにそれぞれ記述する。
before_action :authenticate_admin!
autehntiateは、「認証する」という意味です。
つまりこの記述は、
「このコントローラー(items_controller)に記述してあるアクションは、adminだけが使用できるよ。
だから、アクションを実行する前に、adminであるか確認してね。」
を意味します。
adminじゃなければ、ログイン画面に遷移されます。
方法②
apllicationコントローラーで纏めてアクセス制限を行う方法。
class ApplicationController < ActionController::Base
before_action :authenticate_admin!, if: :admin_url
def admin_url
request.fullpath.include?("/admin")
end
end
分解して解説します。
before_aciton
before_action :authenticate_admin!, if: :admin_url
=> ①で説明しているのでベースは省きます。
ifの部分ですが、「admin_urlを参照する」を意味します。
この後に、「admin_url」のメソッドが記述します。
admin_url
def admin_url
request.fullpath.include?("/admin")
end
=> request.fullpathで、飛んだ先のpathを全て取得します。
include?(val)で、valと同じ要素が含まれていれば、trueを返します。
つまり、**パスに「/admin」が含まれているかどうかを確認する。**です。
となります。
なので、 まとめると、
「pathに/adminが含まれている全てのページは、adminでログインしないと見れないよ。」
となります。
以上、たにーでした。
参考文献