この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。
Cookieで保持する情報はユーザー入力を介さないフィールドであるidとsaltを使います。
そしてCookieで保持しているidとsaltから該当するUserオブジェクトを取得するメソッドを用意します。
app/model/user.rb に以下のpublicメソッドを追加します。
def self.authenticate_with_salt(id, cookie_salt)渡されたidをキーにUserオブジェクトを取得し、渡されたsaltと比較します。
user = find_by_id(id)
(user && user.salt == cookie_salt) ? user :nil
end
ではcookieに書き込む側と読み込む側を実装します。
app/helpers/sessions_helper.rbに記述します。
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id,user.salt]
end
def current_user
User.authenticate_with_salt(*remember_token)
end
def signed_in?
!current_user.nil?
end
private
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
sign_inメソッドでは渡されたuserオブジェクトのidとsaltをcookieに保存しています。
現在アクセスしているユーザーを参照するcurrent_userメソッドではまずremember_tokenメソッドでcookieで保存している情報(idとsalt)を取得します。そして取得したidとsaltを先ほど実装したauthenticate_with_saltメソッドで認証します。パラメータに「*」がついていますが、これは配列を分解して渡すことを意味します(ここでは[id, salt]という配列を「id」「salt」という2つの変数として渡す)。
そしてauthenticate_with_saltの認証結果に応じた結果(成功=userオブジェクト、失敗=nil)を返します。
ではサインインのタイミングでcookieに値を保存するようコントローラに追記しましょう。
app/controller/sessions_controllerに下記の赤字部分を追加します。
def create認証成功時にヘルパメソッドを通じてcookieに値を保存します。
user = User.authenticate(params[:session][:name],
params[:session][:password])
if user.nil?
flash.now[:error] = "サインインできませんでした"
@title = "サインイン"
render 'new'
else
sign_in user
redirect_to user
end
end
しかしまだこのままではコントローラからヘルパメソッドを呼ぶことができません。
アプリケーション共通で使えるように app/controller/application_controller.rb に下記の赤字部分を追記します。
class ApplicationController < ActionController::BaseこれでどこからでもSessionsHelperに定義したヘルパメソッドが呼べるようになりました。ではテストを実行してみましょう。
protect_from_forgery
include SessionsHelper
end
遂に0件になったハズです。