Railアプリで以下の要件を満たす場合、

■要件 
1.ログイン時にパスワード認証 (7文字以上英数混在)
2.ベーシック認証はイヤ!
3.パスワードの有効期限180日
4.ユーザーがパスワードを更新できる。
5.ユーザーがパスワードを忘れた場合は再発行メールを送れる。
6.管理者のみユーザーを追加できる。 
7.ユーザーはコントロールのアクション毎のロール許可

自前で作るのは大変なので、プラグインを探しに行きましょう。
って事で前回RubyToolboxにてそのカテゴリーの1番人気を使ってみましょう。
どうやらdeviseが1番人気の様ですね。

今回の環境は
ubuntu server 10.04 LTS
Ruby 1.8.7
Rails 3.0.8
MySQL 5.5

deviseはさすが1番人気だけあってRails3対応は問題なさそうですし、ドキュメントや日本語の情報もあってよさそうですし、要件もほぼ満たしています。有効期限はなさそうですがそのへんは自前で実装できそうですね。

では早速使ってみましょう。まずRailsでアプリを作ります。
$ rails new app -T -d mysql
オプションの-Tはtestフォルダをスキップ(rspec使うので)、
-d mysqlはDBにMySQLを使うよって事


つづいてGemfileを開いて、以下を編集
#gem 'mysql2', '~> 0.2.7'  ←コメントアウト
gem 'mysql2', '< 0.3'  ←追加
gem 'devise'     ←追加

ちなみにmysql2をなんで修正しているかというと、そのままだと0.3系のRails3.1用が入ってしまうからです。
現時点でrails3.0.8ならmysql2は0.2.7を使う必要があります。

でインストール(MySQLやrailsは入ってる前提です)
$ bundle install
$ rails g devise:install

すると、以下のメッセージがでます。
===============================================================================

Some setup you must do manually if you haven't yet:

  1. Setup default url options for your specific environment. Here is an
     example of development environment:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     This is a required Rails configuration. In production it must be the
     actual host of your application

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       

<%= notice %>

<%= alert %>

===============================================================================
13さいの英語力だと、
1. environment以下の設定ファイルにconfig.action_mailer.default_url_optionsを設定してね。
これは必須の設定だよ

2. config/routes.rbにrootのurlを設定してくれよ

3. flashメッセージを表示するようになってるか確認してにょ 

と理解するのが限界ですw。

言われたとおりに1.は
config/environmentsのdevelopment.rb と production.rb と test.rbに以下を追加
  config.action_mailer.default_url_options = { :host => 'localhost:3000' } 
※ホスト名は各環境に合わせてください

言われたとおりに2.は
config/routes.rbに 
root :to => "welcome#index"
としました。 

3.はapplicationにflashメッセージ表示は組み込まないので無視します。(あとで別な場所に実装します。) 

次はdeviseで使用するユーザーモデルを作成します。今回は安易にUserにします。
$ bundle exec rails g devise User

作成されたmigrateファイルを確認します。 
class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end
これだと、要件の 3と7に必要な情報がないので以下のフィールドを追加します。
t.integer :role_id, :null => false #ロール
t.datetime :expiration_at, :null => false  #有効期限
さらにt.rememberableは要件1の為に必要ないのでコメントアウトしておきます。
※remembebleはクッキーにトークンを保存してセッションが切れてもログインし直さないで済む機能です。

次はmodelです。 
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, #:registerable, :rememberable,
         :recoverable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :role_id, :expiration_at #, :remember_me
end
要件1,6の為、rememberbleとresigterableはコメントアウトしています。
※resigterableはユーザをユーザ自身で登録できるようにする機能です。
さらに、パスワード有効期限とロールidのattr_accessibleを設定しています。

あとはconfig/routes.rbに以下の行を追加します。
devise_for :user
あとは、
$ rake db:create 
$ rake db:migrate
$ rails s
してrailsを起動します。
そのあとでhttp:localhost:3000/user/sign_inにアクセスしてみましょう。
お粗末な感じのログイン画面が現れました。

さて、今回はこの辺でおしまいにします。続きは次回に