CentOS5のRails2でrestful_authenticationによる認証をする

まともなWebプログラムであればユーザ認証処理は必須である。ApacheのBasic認証に任せても良いが、ログアウトができなかったり、Webプログラム上でユーザ管理ができなかったりといろいろいろ不満がある。Look&FeelをそろえるためにもWebプログラムに実装したいのだが、以前perlでCGI::Sessionをつかってごりごり作ったときはけこう面倒だった。ところがRuby on Railsでは、プラグインを使ってとても簡単に認証機能を追加することができる。

最初に試したのはacts_as_authenticatedというプラグインだったのだが、どうやらこれはメンテナンスが停止していて、今であればrestful_authenticationを使うものらしい。細かい違いはよくわからないが、基本的な使い方はだいたい同じような感じだ。

まずプラグインをインストールする。プロジェクトのディレクトリ内で以下のコマンドを打つ。

ishii@dev1:~/sample $ script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/

つぎにインストールされたジェネレータを使ってコントローラ、モデル、ビューを生成する。コントローラはusers_controller.rbとsessions_controller.rb、モデルはuser.rb、ビューはsessions/new.html.erbとviews/users/new.html.erbが生成される。

ishii@dev1:~/sample $ script/generate authenticated user sessions

usersコントローラにはnewとcreateというメソッドがあり、newが新規ユーザ登録画面となる。sessionsコントローラにはnew、create、destroyというメソッドがあり、newでログイン画面となる。destroyはログアウト処理だが画面はない。

usersテーブルのスキーマは以下のとおり。

  create_table "users", :force => true do |t|
    t.string   "login"
    t.string   "email"
    t.string   "crypted_password",          :limit => 40
    t.string   "salt",                      :limit => 40
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "remember_token"
    t.datetime "remember_token_expires_at"
  end

そうしたらデータベースをマイグレーションする。

ishii@dev1:~/sample $ rake db:migrate 

そして、アプリケーションに認証システムを使うことを指示する。users/sessions_controller.rbに書いてある以下の一行を削除(コメントアウト)して、同じ内容をapplication.rbに追加する。

include AuthenticatedSystem

ここまでくれば、script/serverでWEBrickを起動すれば動作確認をすることが出来る。ユーザ登録画面は/users/new、ログイン画面は/sessions/new、ログアウト処理は/sessions/destroyで行う。

アプリケーションを使用する際に認証を必要にするためには、コントローラに以下を追加する。

before_filter :login_required

特定のメソッドだけを除外(認証無しで利用可能)にしたい場合は以下のようにする。

  before_filter :login_required, :except => [:index, :show]

ログインをしているかどうかは、logged_in?で確認できる。またログインしている場合にはユーザ名をcurrent_user.loginで参照できる。