2009年11月16日月曜日

Devise: Rails向けの柔軟性のある認証ソリューション

先日、2009年11月15日(日)にRails勉強会@東京第45回に参加させて頂きました。とてもいい雰囲気でとても楽しむことができました。本当にありがとうございました。

残念なことに、最近、新規の参加者が少ないとのことでした。もしこれを読んでいて、Rails勉強会@東京に参加したいけど、敷居が高いかなぁとかRailsに興味があるけど使ったことないからどうしようと思っていたら、一度、ぜひ、参加してみて下さい。初心者向けのセッションもあります。あと、もうRailsは大丈夫というかたでも、最新のRails事情などの情報を集めたりするいい機会だと思います。

自分は、普段、岐阜に住んでいるので、毎月の参加はできないですが、機会があれば、参加させて頂きたいと思います。

今回は、自分の理解を深めるために勉強会で話題になったRailsで使うことのできる新しい認証方式のDeviseについての記事に挑戦してみました。Plataforma tecnologiaというブラジルの会社のブログであるから、José Valimさんの「Devise: flexible authentication solution for Rails」という記事です。



Devise: Rails向けの柔軟性のある認証ソリューション
José Valim

アップデート: この記事はDeviseの紹介でしたが、記事が書かれてからいくつかの更新がありました。も最新記事には、以下に書かれている内容と同じようにgeneratorsの使い方を同じ段階で説明しています。もっと詳細で常に更新された説明についてはREADMEファイルを参照して下さい。

Rails Summit Latin America 2009でのライトニングトークでDeviseについての紹介をしました。本日(訳者注: 2009年10月21日)、正式にリリースを行いました。コード例を紹介する前にDeviseで実現したいことを説明したいと思います。まず、はじめに現在最も利用されている認証ソリューションであるClearanceAuthlogicから説明したいと思います:

Clearance

ClearanceはRails Enginesを使って、モデル、ビュー、そして、コントローラ全てに実装するフルスタックの認証ソリューションです。アカウント確認やパスワード復旧などに対応します。プラグインをインストールだけで実現できます。しかしながら、Userモデルを使用する必要があり、異なるロールを加えたり、既存のロールを変更することはできません。

Authlogic

モデルでは、Authlogicは間違いなくもっとも完全なソリューションです。いくつかの暗号化方法や設定可能なたくさんの他の便利な機能が提供されています。しかしながら、(ユーザーのアカウントの確認やパスワードの復旧方法が示されていないなど)フルスタックのソリューションではなく、モデルでセッションを扱うことのついて論議を呼んでいます。さて、個々で質問です。じゃぁ、どこでセッションを扱うべきなのでしょうか?

そこでWarden

Wardenは汎用のRackでの認証フレームワークで、Daniel Neighmanによって開発されました。WardenはRackミドルウェアでセッションを取り扱います。この主な利点としては、いくつかのアプリーケーション間で認証方法を共有できることです。そのため、Sinatora、Rails、そして、他のミドルウェアなどを同時に使っていても、同じ認証方法を使うことができます。

Device: 認証のための戦略

Wardenを気に入ったのでいくつかのプロジェクトで使ってみました。そして、Clearanceのようですが、Authlogicのように柔軟性のあるソリューションをWardenを利用して開発してみることにしました。それがDeviseです。Rails Engineでいくつかのロールを取り扱います。それぞれのロールが異なる方法で認証することができます。Deviseでは、現在の所、5つの認証方法があります:

  • Autheticatable: パスワードを暗号化したりログイン時にユーザーを認証したります。
  • Confirmable: アカウントをログインするかどうか確認したり、確認方法をメールで送ったりします。
  • Recoverable: ユーザーのパスワードを初期化したり、初期化方法をメールで送ったりします。
  • Remenberable: 保存したクッキーを使ってユーザー認証する際のトークンを生成したり削除したりします。
  • Validatable: メールでvalidationの必要なこと全てやパスワードを生成します。任意でvalidation方法を変更することができます。

良いこととしては: 招待を取り扱う必要があるアプリケーションを作成することを考えてみて下さい。招待用の認証方法をDeviseで作成する必要があるだけで、祖霊所は何もする必要はありません。

コードを!

READMEには、プロジェクトでDeviseを使い始めるために必要な情報が書かれています。ここでは、その主要な点を説明したいと思います。あるユーザーモデルを作成していて、認証して、パスワードを復旧する必要があるとします。最初にDeviseのマイグレーションヘルパーを使ってカラムを作成します:

create_table :users do |t|
  # email、encrypted_password、password_solt列を作成
  t.authenticatable
 
  # reset_password_token列を作成
  t.recoverable
end

それから、どの認証方法を使うかをモデル内で宣言する必要があります。

class User < ActiveRecord::User
  # Authenticatableモジュールはすでにincludeされている
  devise :recoverable, :validatable
end

そして、routeを作成します:

ActionController::Routing::Routes.draw do |map|
  # READMEで設定パラメータを確認して下さい
  map.devise_for :users
end

routeは作成したモデルにアクセスして、宣言した方法のためのrouteだけを作成します。Devise内の確認のためのコントローラにアクセスできないことを保証します。Deviseはコントローラ内で使うことができるいくつかのヘルパーやフィルターも追加します:

  # 認証で保護されたコントローラ内で使用
  before_filter :authenticate_user!
 
  # コントローラやビューで使用
  user_signed_in?
  current_user
  user_session

user_sessionメソッドはユーザーモデルのみに利用できるHashです。そのため、2つのロールがある場合、異なるセッションHashとデータはconfolictしません!これはWardenからそのまま受け継いでいる素晴らしい機能です。 Deviseでは国際化(I18n)サポートもRails Engineとして実装されています。そのため、アプリケーション内にそのエンジンのコピーを置くことでビューをカスタマイズすることができます。Githubに使用例としての小さなアプリケーションがあります

他に?

ブルートフォース保護やセッションの時間切れといった他の認証方法をgeneratorとしてDeviseに追加する予定です。もしよかったら、TODO一覧を見て下さい。

謝辞

Deviseを開発して実用レベルまでにしたCarlos AntônioWardenを紹介してくれたJonas Nicklas、それを開発して保守しているDaniel Neighmanに感謝します。

Clearanceを開発する間のいろいろな決定ヒントを書いてくれたThoughtbotの人たちに感謝したいと思います。それらはDeviseを開発する助けとなりました。

最後に、Rails Summitでリリースする機会を与えてくれたFábio AkitaRuby 5にDeviseの記事を書いてくれたGregg Pollackに感謝の意を表します。

(終)



訳文に間違いや分かりにくい点があれば、コメントやメールで連絡を頂ければ幸いです。

0 件のコメント: