2011年8月31日水曜日

Rails3を初歩から学ぶ #13 認証情報を保持する

この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。

前回は認証処理を実装しましたがセッションをまたぐことが出来ていないので大変に不便です。そこでCookieにセッション情報を保存するようにしてやりましょう。
Cookieで保持する情報はユーザー入力を介さないフィールドであるidとsaltを使います。
そしてCookieで保持しているidとsaltから該当するUserオブジェクトを取得するメソッドを用意します。
app/model/user.rb に以下のpublicメソッドを追加します。

def self.authenticate_with_salt(id, cookie_salt)
user = find_by_id(id)
(user && user.salt == cookie_salt) ? user :nil
end
渡されたidをキーにUserオブジェクトを取得し、渡されたsaltと比較します。
では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
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
認証成功時にヘルパメソッドを通じてcookieに値を保存します。
しかしまだこのままではコントローラからヘルパメソッドを呼ぶことができません。
アプリケーション共通で使えるように app/controller/application_controller.rb に下記の赤字部分を追記します。


class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
end
これでどこからでもSessionsHelperに定義したヘルパメソッドが呼べるようになりました。ではテストを実行してみましょう。
遂に0件になったハズです。

0 件のコメント:

コメントを投稿