rails tutorial 10章 認可の実装の要約

みなさんおはようございます。

本日はrails tutorial 10章の認可についてまとめてみました。
もし、良ければ見ていってください。

認証と認可の違い

最初に似ている単語である認証と認可の違いについて簡単に説明しようと思います。

認証とは・・・サイトにログインしているユーザーを識別すること
認可とは・・・現在ログインしているユーザーができる行動を管理することです。

認可を具体例を挙げるならば、プロフィールの編集が挙げられます。
自分のだけでなく、他人のも変えられたらやりたい放題になってしましますよね。
そのようなことが無いように、認可で行動を管理します。

認可の実装

それでは実装についてまとめましたので、ぜひ見ていってください。
具体的にはログインしているユーザーは自分のプロフィール以外は編集できないという認可を実装していきます。

許可されていないユーザーがアクセスしようとした時にはbeforeフィルターを使います。
これは何らかの処理が実行される直前に行うメソッドです。

users_controller.rb

before_aciton :logged_in_users, only: [:edit, :udate]
・
・
・
def logged_in_users
unless is_logged_in?
flash[:danger] = "Please log in"
redirect_to root_url
end
end

これでまずログインしていないユーザーはedit,updateアクションを行おうとしたらroot_urlにリダイレクトします。
デフォルトではbeforeアクションは全てのアクションに適用されるためonlyで指定します。

次にログインしているユーザーは自分の情報以外変更できないようにします。
別のユーザーの情報を変更しようとしたらリダイレクトさせたいのでcorrect_userというメソッドを作成し、beforeフィルターで呼び出します。

before action :correct_user, only:[:edit, :update]
・
・
・
def correct_user
@user = User.find(params:id)
redirect_to root_url unless @user == current_user
end

次にリファクタリングですが、currnet_user?という論理値を返すメソッドを作成し、correct_userのunless @user == current_userの部分を変更します。

sessions_helper

def current_user?(user)
user = current_user
end

users_controller

def correct_user
@user = Use.find(params[:id])
redirect_to root_url unledd current_user(@user)
end

最後にログインした後に元々アクセスしようとしていたページにリダイレクトさせるアクションを作りたいと思います。

ユーザーを希望のページにリダイレクトさせるにはそれらのページをあらかじめ保存しておき、ログインができたらそのページにリダイレクトさせるという動作が必要になります。
これらの動作をstore_location,redirect_back_orメソッドで定義します。

sessions_helper

def store_location
session[:fowarding_url] = request.original_url if request.get
end
def redirect_back_or(default)
redirect_to([:fowarding_url] || default)
session.delete[:following_url]
end

store_locationメソッドではrequestに送られてきたurlをsession変数のfowarding_urlキーに格納します。
store_locationはユーザーがログインしてない時にedit,udateアクションしようとした時に行いたいのでlogged_in_userに加えます。

def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in"
redirect_to login_url
end
end

フォワーディング自体を実装するにはrediret_back_orメソッドを追加します。
このメソッドはsession[:fowarding_url]の値がtrueならそのurlに、なければデフォルトの値に飛びます。
デフォルトはcreateアクションに設定します。
users_controller

def create
・
・
・
redirect_back_or user
end

説明は以上です。
最後まで見ていただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です