第12回: ユーザー認証(1)

2010/05/18

前回は、Rails 3.0 で導入された新しい Gem パッケージ管理ツール Bundler を紹介しました。

今回と次回はユーザー認証の仕組みをアプリケーションに追加します。

Devise

Devise を利用すると、メールアドレスとパスワードによるユーザー認証機構を Rails アプリケーションに簡単に組み込むことができます。

現時点(2010/08/30)での最新版は 1.1.2 です。Gemfile を次のように修正してください。

source 'http://rubygems.org'

gem 'rails', '3.0.0'
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'will_paginate', '3.0.pre'
gem 'devise', '1.1.2'

続いて、Bundler でインストールします。

% bundle install

ただし、Windows ユーザーの方は、Devise が依存する bcrypt-ruby パッケージのインストールで失敗するかもしれません。その場合、おそらく次のようなエラーメッセージが出ていることでしょう。

'make' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。

この場合は、DevKit をインストールしてみてください。手順は、以下の通り:

  1. http://rubyinstaller.org/downloads/ を開き、「DEVELOPMENT KIT」セクションにある最新の .exe ファイル(自己展開型圧縮データ)をダウンロード。
  2. ダウンロードしたファイルをダブルクリックし、展開(解凍)先のフォルダとして「C:\DevKit」と指定する。
  3. コマンドプロンプトを開き、以下のコマンドを順に実行する。
cd \DevKit
ruby dk.rb init
ruby dk.rb install

DevKit のインストールが完了したら、Nchack アプリケーションのフォルダに戻って、再び bundle install を実行してください。

コマンド gem list devise を入力して、次のように出力されればインストール成功です。

*** LOCAL GEMS ***

devise (1.1.2)

[更新] DevKit を利用して Windows 環境に Devise をインストールする手順の記述を追加しました。(2010-10-11)

Windows 環境で使用できる Ruby バイナリには、rubyinstaller.org で配布しているものの他に、ActiveScriptRuby もあります。しかし、ActiveScriptRuby は DevKit に対応しておりませんのでご注意ください。読者から教えていただきました。(2010-11-12)

Devise の準備

Devise を使うには、いくつか準備作業が必要です。

まず、Devise をアプリケーションに組み込みます。

% rails generate devise:install

次に、config/environments/development.rb を開いて、次のように修正します。

Nchak::Application.configure do
  (省略)

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

本番環境にアプリケーションをセットアップする際には、実際に使用するドメイン名を config/environments/production.rb に記述する必要があります。

次に、app/views/layouts/application.html.erb を修正します。ログインに成功または失敗した時などに Devise が設定するメッセージを画面に表示するためです。

(省略)
    <div id="contents">
      <p class="notice"><%= notice %></p>
      <p class="alert"><%= alert %></p>
      <%= yield %>
    </div>
(省略)

トップページの作成

我々の Nchak にはまだトップページがありません。この辺りで作っておきましょう。

まず、public/index.html を削除します。

次に、config/routes.rb を修正します。

Nchak::Application.routes.draw do
  root :to => 'welcome#index'
  
  resources :tasks, :only => [ :index, :create ] do
    put :finish, :on => :member
    put :unfinish, :on => :member
    get :done, :on => :collection
  end
end

root :to => 'welcome#index' という記述は、ルートパス(/)にアクセスがあったら、welcome コントローラの index アクションが対応する、ことを宣言しています。

welcome コントローラの index アクションを生成します。

% rails generate controller welcome index

ブラウザでトップページを開くと、次のように表示されるはずです。

画面キャプチャ1

ビューの生成

Devise が使用する標準のビュー(HTMLテンプレート)を生成します。

% rails generate devise:views

このコマンドを実行すると、app/views/devise ディレクトリに数多くの ERB ファイルが生成されます。Devise はこれらのテンプレートを使って、ユーザー登録フォーム、ログインフォーム等を表示したり、ユーザー登録の確認メールの本文を作ったりします。我々がこれらを書き換えれば、自由にアプリケーションをカスタマイズできます。

User モデルの作成

User モデルを作ります。

% rails generate devise user

このコマンドによりモデルクラスファイルとマイグレーションスクリプトが生成されます。

モデルクラスファイル app/models/user.rb の中身は、こうなります。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation
end

マイグレーションスクリプト db/migrate/20100522000000_devise_create_users.rb は、こうです。

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.confirmable
      t.recoverable
      t.rememberable
      t.trackable

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

      t.timestamps
    end

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

  def self.down
    drop_table :users
  end
end

マイグレーションを実行します。

% rake db:migrate

第13回: ユーザー認証(2)へ続きます。

[更新] Rails 3.0.0 正式リリースと Devise 1.1.2 リリースに合わせて、Gemfile のコードを変更しました。(2010/08/30)

[更新] 読者からのご指摘により、rails generate devise_installdevise:install と修正しました。同様に rails generate devise_viewsdevise:views と修正しました。(2010/09/07)

[更新] Devise 1.1.2 リリースに合わせて、User モデルとマイグレーションスクリプトのコードを変更しました。(2010/10/11)