シリーズ:Acts as Authenticated その壱

今回はユーザ認証機能とサインアップ機能の追加とちょっとしたノウハウの説明です。
まず、インストールです。

./script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated

でインストールされます。これはジェネレータ形式のプラグインです。

./script/generate authenticated user account

以上でuserモデルとmigrationファイルが作成されます。
また、accountコントローラ、テストのファイル、lib/のディレクトリに
ライブラリが入ります。
accountコントローラには

include AuthenticatedSystem

の部分があります。これをapplication_controller.rbに移動してください。
認証が必要なコントローラに以下のように追加します。

before_filter :login_required

特定のアクションにだけかけたいときは

before_filter :login_required, :only => [ :edit, :update]

のように書きます。
特定のサブクラスを飛ばしたい場合は

skip_before_filter :login_required

をそのクラスに書きます。
※注意
application_controller.rbにbefore_filter :login_requiredを書いた場合は
account_controller.rbにskip_before_filter :login_requiredを書かないと
ループになります。
認証モジュールを組み込むと以下のメソッドが使えます。

  • logged_in? - ログインしている場合はtrueが返ります。
  • current_user - ログインしているユーザのインスタンスが返ります。

アクションを制限したい場合は以下のようにprotect?メソッドを上書きします。

# loginとabountメソッドは制限しない場合です
def protect?(action)
  if ['login', 'about'].include?(action)
     return false
  else
     return true
  end
end

ユーザによってコントローラのアクションを制限する場合は#authorize?メソッドを上書きします。

# xibbar以外の人に許可します
def authorize?(user)
  user.login != "xibbar" 
end

Q:両方の制限を加える場合はどうするの?
複数のアクセス権が必要なコントローラを作りたいんですけど。例えば

  • いくつかのメソッドは全ての人に見せたい
  • いくつかのメソッドは登録してログインさせてから見せたい(コメントの書き込みなど)
  • いくつかのメソッドは管理者権限が欲しい(削除など)

A:

# newとcreateメソッドを使えるのはadminだけにする
def authorized?(user)
  if ['new', 'create'].include?(action_name)
     return false unless user.is_admin?
  end
  return true
end

以上のようにするとadminだけにできます。Userモデルに
is_admin?を付け加えましょう。

Railsの使えるレンタルサーバ

rootをもらわなくてもRailsが動き、スピードがのろくないレンタルサーバ
(つまりCGIじゃないということ。)

以下は新ネタ