ログイン状態を判定する

rails の定石を知らないが、ログインしてセションが有効になっているかを判定し、有効で無い場合はログイン画面を表示する方法を考えてみる。

ログイン画面では LoginController を使用し、ログインに成功すると ListController に遷移するとする。

  • LoginController
class LoginController < ApplicationController
  def login
    begin 
      user = User.find(params[:id])
      if user.password == params[:password]
        session[:second_session_id] = session.session_id
        redirect_to "/list"
        return
      end
    rescue ActiveRecord::RecordNotFound 
    end
    redirect_to :action=>"index" , :id=>params[:id],:message=>"login error"
  end
end
  • ApplicationController
class ApplicationController < ActionController::Base
  before_filter :check_session_id
  protected
  def check_session_id
    return if controller_name == "login"
    if !session[:second_session_id] || 
               session[:second_session_id] != session.session_id
      redirect_to "/login"
    end
  end
end

ログインに成功したらセションIDを別キー(:second_session_id)で保持。
before_filter で 現在のセションIDと別キーで保持しているセションIDをチェックし、異なる場合はログイン画面(LoginController)に飛ばす。
とりあえず思い通りには動いてくれてる。

今は session_id をそのまま保持しているけど、ログイン状態を保持するクラスを用意しておいて、ログインID、ログイン時刻、最終処理時刻なんかを詰め込んでおけば一定時間処理が無ければログアウトさせるとかできるよね。