おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Rails3.1で追加されるパスワード暗号化機能について

Rails 3.1 からパスワードの暗号化用のモジュールができたようです。ActiveModel::SecurePassword で定義されていて、ActiveRecord や Mondoid などの ActiveModel を利用しているモデルで使えるそうな。

User モデルに password_digest カラムが設定されている前提で

class User < ActiveRecord::Base
  has_secure_password
end

とすると、下記のような効能が得られます。

  • attr_reader :password
  • validates_confrmation_of :password
  • validates_ppresence_of :password_digest
  • password に何か代入すると自動で bcrypt-ruby でハッシュにされて password_digest に代入される
  • 文字列がパスワードと等しいかをチェックする authenticate メソッドが定義される

ログイン機能はそれ専用のプラグインを使って作るのが良いのでは?

ログインを簡単に実装するためのプラグインは devise, authlogic 等いろいろありますが、デフォルトの挙動を修正したい時に RailsRuby に関する多くの知識が必要とされるので、初心者にはお勧めできません。devise の README にも下記のように書かれています。

If you are building your first Rails application, we recommend you to not use Devise. Devise requires a good understanding of the Rails Framework.

まずはスクラッチでつくってみて、慣れてきたら devise 等のプラグインを試してみるのが良いと思います。これらのプラグインに慣れてしまえば、少量のコードで多くの機能を追加することが出来て大変便利です。

ログイン機能をスクラッチで作る際に参考になるサイト

ログイン機能をスクラッチで作るには下記のASCIIcastsのエントリが大変参考になります。

ASCIIcasts - “Episode 250 - ゼロから作る認証機能”

ASCIIcastsでは Rails3.0 のアプリにログイン機能を追加しているので、 ActiveModel::SecurePassword は使われていません。3.1 でログイン機能をスクラッチで作りたい場合は、上記のソースコードを改変して作ってみると良いと思います:-)