概要
セッション機能を使って、悪性制御を行う。
サインインしていない状態で登録ユーザー用のページ(今回はトップページ)にアクセスした場合、これを表示せずにサインインページにリダイレクトする。
また、サインイン状態でルートにアクセスした場合はトップページを表示する。
セッション中確認機能の追加
以下のメソッドをUserHelpaerモジュールに追加する。
user_in_session?
- アクセスしたユーザーがサインイン中かどうか(そのユーザーのセッションが存在するか)判定するメソッド。
authorize
- ユーザーがサインイン状態でなければサインインページにリダイレクトするメソッド。コントローラーのフィルターでコールバックとして登録するのに用いる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
module UsersHelper ..... def user_in_session? user_in_session.present? end ..... def authorize redirect_to :sign_in unless user_in_session? end end |
アクション実行前の認証
UserHelper
で定義したauthorize
メソッドを、トップページを含むpage
コントローラーのフィルターで設定する。
1 2 3 4 5 6 |
class PagesController < ApplicationController before_action :authorize def top end end |
ここではpage
コントローラーのフィルターとして設定し、コントローラーにはtop
アクションが含まれている。
アクセスしたユーザーがサインイン状態であればtop
ビューがレンダリングされ、サインインしていなければauthorize
の内容に従ってsign_in
ページに遷移する。
たとえばアクションによって振り分けたい場合はフィルターのonly
やexcept
で対象となるアクションを制御する。